利用小Pandas进行矩阵运算

2024-06-28 19:59:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图测试在Matrix search operation using numpy and pandas上给出的相同示例

3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:32:08 UTC 2012 i686 i686 i686 GNU/Linux上,使用python 2.7.3, numpy 1.9.2 and pandas 0.15.2

举个小例子:

ds1 = [[ 4, 13,  6,  9],
       [ 7, 12,  5,  7],
       [ 7,  0,  4, 22],
       [ 9,  8, 12,  0]]
ds2 = [[ 4,  1],
       [ 5,  3],
       [ 6,  1],
       [ 7,  2],
       [ 8,  2],
       [ 9,  3],
       [12,  1],
       [13,  2],
       [22,  3]]

ds1= pd.DataFrame(ds1)
ds2= pd.DataFrame(ds2)
C = np.where(ds1.values.ravel()[:, None] == ds2.values[:, 0])
print C

给出错误的结果

^{pr2}$

预期输出

output = [[1, 2, 1, 3],
          [2, 1, 3, 2],
          [2, 0, 1, 3],
          [3, 2, 1, 0]]

在处理大矩阵值的时候

ds1 = pd.read_table('https://gist.githubusercontent.com/karimkhanp/9527bad750fbe75e072c/raw/ds1', sep=' ', header=None)
ds2 = pd.read_table('https://gist.githubusercontent.com/karimkhanp/1692f1f76718c35e939f/raw/6f6b348ab0879b702e1c3c5e362e9d2062e9e9bc/ds2', header=None, sep=' ')
C = np.where(ds1.values.ravel()[:, None] == ds2.values[:, 0])
print C

它给予

(1000, 1001) (4000, 2)
(array([], dtype=int32),)

而不是替换的矩阵值。在

任何建议都会很有帮助。在


Tags: andnumpynonedataframepandasnp矩阵where
2条回答

我同意@Anthony Lethuillier的回答,我猜IndexError可能是由不同的版本引起的。似乎是在@nlper的情况下,C(array([], dtype=int32),),这意味着在ds1.values.ravel()[:, None] == ds2.values[:, 0]中找不到任何东西,这明显不同于@Anthony。没有发现任何内容,因此{}是一个只包含1个元素的元组,因此当您访问C[1]时会触发IndexError。在

这也适用于我的机器,所以我不知道为什么C是空的。我建议您详细打印ds1.values.ravel()和{},看看为什么没有什么是相等的。在

此外,我使用了python2.7.9、numpy 1.9.2和pandas 0.16.1

C中的第二个数组(array([0,7,2,5,3,6,1,3,3,0,8,5,4,6])给出了要在ds1中替换的值的位置。在

所以必须替换ds1中的值。值.ravel()第一个C数组的索引,ds2中的值,第二个C数组的索引

下面是为小示例提供正确输出的代码:

import pandas as pd
import numpy as np

ds1 = [[ 4, 13,  6,  9],
      [ 7, 12,  5,  7],
      [ 7,  0,  4, 22],
      [ 9,  8, 12,  0]]

ds2 = [[ 4,  1],
       [ 5,  3],
       [ 6,  1],
       [ 7,  2],
       [ 8,  2],
       [ 9,  3],
       [12,  1],
       [13,  2],
       [22,  3]]

ds1= pd.DataFrame(ds1)
ds2= pd.DataFrame(ds2)

C = np.where(ds1.values.ravel()[:, None] == ds2.values[:, 0])

ds1_new = ds1.values.ravel()

ds1_new[C[0]]=ds2.values[C[1], 1]

ds1_new = ds1_new.reshape(4,4)

print(ds1_new)

ds1 = pd.read_table('https://gist.githubusercontent.com/karimkhanp/9527bad750fbe75e072c/raw/ds1', sep=' ', header=None)
ds2 = pd.read_table('https://gist.githubusercontent.com/karimkhanp/1692f1f76718c35e939f/raw/6f6b348ab0879b702e1c3c5e362e9d2062e9e9bc/ds2', header=None, sep=' ')

C = np.where(ds1.values.ravel()[:, None] == ds2.values[:, 0])

ds1_new = ds1.values.ravel()

ds1_new[C[0]]=ds2.values[C[1], 1]

ds1_new = ds1_new.reshape(1000,1001)

print(ds1_new)

给出以下输出:

^{pr2}$

相关问题 更多 >