【问题标题】:numpy array slicing produces an error indexing arrays could not be broadcast togethernumpy 数组切片产生错误索引数组无法一起广播
【发布时间】:2022-02-27 04:13:51
【问题描述】:

我有一个np.array

a = np.array([x for x in range(10) for y in range(10)]).reshape(10, 10)

我想获得3rd6th 行列4,7,10 - 标记为绿色。

我试过了:

a[[2,5]] # gives me the rows  I want
a[[2,5], [3,6,10]]  # produces an an error

IndexError: 形状不匹配:索引数组无法与形状 (2,) (3,) 一起广播

最后的结果应该是这样的:

[[2,2,2],
[5,5,5]]

我的错误在哪里?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    第一个索引列表必须是 (2,1) 形状(或等效列表):

    In [31]: a[[[2], [5]], [3, 6, 9]]
    Out[31]: 
    array([[2, 2, 2],
           [5, 5, 5]])
    

    你明白broadcasting的错误信息是什么意思吗?


    对于简单的加法,(2,1) 数组与 (3,) 一起广播以产生 (2,3) 结果:

    In [32]: I, J = np.array((2, 5)), np.array((3, 6, 9))
    In [33]: I, J
    Out[33]: (array([2, 5]), array([3, 6, 9]))
    In [34]: I + J
    Traceback (most recent call last):
      Input In [34] in <module>
        I + J
    ValueError: operands could not be broadcast together with shapes (2,) (3,) 
    
    In [35]: I[:, None] + J
    Out[35]: 
    array([[ 5,  8, 11],
           [ 8, 11, 14]])
    

    同样的想法也适用于多个数组的索引。

    您的a 可以使用相同的逻辑创建:

    In [38]: np.arange(10)[:, None] + np.zeros(10,int)
    Out[38]: 
    array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
           [2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
           [3, 3, 3, 3, 3, 3, 3, 3, 3, 3],
           [4, 4, 4, 4, 4, 4, 4, 4, 4, 4],
           [5, 5, 5, 5, 5, 5, 5, 5, 5, 5],
           [6, 6, 6, 6, 6, 6, 6, 6, 6, 6],
           [7, 7, 7, 7, 7, 7, 7, 7, 7, 7],
           [8, 8, 8, 8, 8, 8, 8, 8, 8, 8],
           [9, 9, 9, 9, 9, 9, 9, 9, 9, 9]])
    

    使用 2 个大小匹配的数组(列表),效果是选择一个“对角线”或一维值数组(而不是您尝试获取的块):

    In [39]: a[[2, 3], [5, 6]]
    Out[39]: array([2, 3])
    In [40]: a[2, 5], a[3, 6]
    Out[40]: (2, 3)
    

    【讨论】:

      【解决方案2】:

      我相信这个链接将解释一切,因为问题是相同的并且得到了很好的答案: Selecting specific rows and columns from NumPy array

      【讨论】:

        猜你喜欢
        • 2020-12-29
        • 2015-02-02
        • 2014-04-06
        • 2020-12-17
        • 1970-01-01
        • 2019-12-10
        • 2018-11-19
        • 2017-06-24
        • 1970-01-01
        相关资源
        最近更新 更多