【问题标题】:matrix operation using numpy pandas使用 numpy pandas 进行矩阵运算
【发布时间】:2015-08-01 04:39:22
【问题描述】:

我正在尝试测试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/Linuxpython 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

给出错误的结果

(array([ 0,  1,  2,  3,  4,  5,  6,  7,  8, 10, 11, 12, 13, 14]), 
 array([ 0, 7, 2, 5, 3, 6, 1, 3, 3, 0, 8, 5, 4, 6]))

预期输出为

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),)

而不是替换的矩阵值。

任何建议都会很有帮助。

【问题讨论】:

    标签: python numpy matrix pandas


    【解决方案1】:

    C 中的第二个数组 (array([ 0, 7, 2, 5, 3, 6, 1, 3, 3, 0, 8, 5, 4, 6]) 为您提供所需值的位置在 ds1 中替换。

    因此,您必须将 ds1.values.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)
    

    给出以下输出:

    [[1 2 1 3]
     [2 1 3 2]
     [2 0 1 3]
     [3 2 1 0]]
    [[  1.   1.   1. ...,   1.   1.  nan]
     [  1.   1.   1. ...,   0.   1.  nan]
     [  1.   0.   1. ...,   1.   0.  nan]
     ..., 
     [  1.   1.   1. ...,   0.   1.  nan]
     [  1.   0.   1. ...,   1.   1.  nan]
     [  1.   1.   1. ...,   0.   1.  nan]]
    

    【讨论】:

    • 能否请您为行添加描述,对于大型矩阵,我添加了ds1_new = ds1_new.reshape(1000,1001),但我在ds1_new[C[0]]=ds2.values[C[1], 1] 得到IndexError: tuple index out of range
    • 编辑了我的答案以包含大矩阵的竞争代码
    • 感谢您的帮助,但对于大型矩阵line 39, in <module> ds1_new[C[0]]=ds2.values[C[1], 1] IndexError: tuple index out of range,我仍然收到相同代码的错误
    • 当我使用 Python2 时它可以工作,所以它不是来自那里,我的 Panda 版本是 0.16 所以可能是这样,我今晚会在我的 Ubuntu 计算机上尝试
    • 刚刚在带有 pandas 0.14、python 2.7.9 和 numpy 1.9.1 的 Ubuntu 上尝试过,它可以工作,也许可以尝试更新重新安装 pandas/numpy/scipy。你试过 Python3 吗?
    【解决方案2】:

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

    这也适用于我的机器,所以我不知道为什么 C 是空的。我建议您详细打印ds1.values.ravel()ds2.values[:, 0],看看为什么没有什么是平等的。

    此外,我使用 python 2.7.9、numpy 1.9.2 和 pandas 0.16.1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-23
      • 2013-08-18
      • 2012-02-08
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多