【问题标题】:numpy multidimensional array indexingnumpy 多维数组索引
【发布时间】:2015-04-19 15:16:18
【问题描述】:

当我在一个 numpy 多维数组中进行索引时,我遇到了一个奇怪的问题。所以,我有一个形状数组 (4, 882)。我有另一个称为形状匹配的数组 (276, 2)。这个匹配数组保存了我原来的多维数组中有效条目的索引。我想做的是选择前 2 行和匹配数组中索引的所有列。所以,我做了如下的事情:

import numpy as np
k = get_array()  # This has shape (4, 882)
m = get_match()  # This has shape (276, 2)

s = k[[1, 0], m[:, 0]]

这会引发错误:

ValueError: shape mismatch: objects cannot be broadcast to a single shape

但是,当我这样做时:

s = k[[1, 0], :][:, m[:, 0]]

这很好用。所以,这实际上是先选择行的子集,然后选择列,但我不确定为什么我的第一次尝试是错误的。另外,做:

s = k[[1, 0], :]

当然可以。

【问题讨论】:

    标签: python numpy multidimensional-array indexing


    【解决方案1】:

    错误消息有点令人困惑,因为形状不匹配不在km 之间。它在[1, 0]m[:,0] 之间。以下是修复它的三种方法,使用以下(更易于可视化的)数组:

    >>> k
    array([[ 0,  1,  2,  3,  4,  5,  6,  7],
           [ 8,  9, 10, 11, 12, 13, 14, 15],
           [16, 17, 18, 19, 20, 21, 22, 23]])
    >>> m
    array([[0, 1],
           [2, 3],
           [4, 5],
           [6, 7]])
    
    1. 将索引列表更改为二维列表,其形状可以针对m广播

      >>> k[[[1], [0]],m[:, 0]]
      array([[ 8, 10, 12, 14],
             [ 0,  2,  4,  6]])
      
    2. 将其转换为数组并重塑数组:

      >>> k[numpy.array([1, 0]).reshape(2, 1),m[:, 0]]
      array([[ 8, 10, 12, 14],
             [ 0,  2,  4,  6]])
      
    3. 将其转换为数组并使用numpy.newaxis,又名None对其进行切片:

      >>> k[numpy.array([1, 0])[:,None],m[:, 0]]
      array([[ 8, 10, 12, 14],
             [ 0,  2,  4,  6]])
      

    还有很多其他的,但这是最容易想到的三个。

    您收到错误是因为numpy 需要以这种方式传递的索引具有相同的形状,或者可以广播到相同的形状。通过使[1, 0] 列表成为“列数组”,您可以使它们可广播。当您尝试将m 乘以[1, 0] 时,也会发生同样的事情:

    >>> m[:,0] * [0, 1]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: shape mismatch: objects cannot be broadcast to a single shape
    

    所有相同的修复都适用。例如:

    >>> m[:,0] * [[0], [1]]
    array([[0, 0, 0, 0],
           [0, 2, 4, 6]])
    

    最后,请注意,您还可以通过传递不同形状的 m 切片来修复它——观察输出被转置:

    >>> k[[1, 0],m[:, 0:1]]
    array([[ 8,  0],
           [10,  2],
           [12,  4],
           [14,  6]])
    

    【讨论】:

    • 哇。非常感谢您提供详细的答案...至少,我为此挠了一个小时!
    • 这在文档中被描述为“高级索引”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2018-01-22
    • 1970-01-01
    • 2019-01-04
    • 2017-05-30
    • 1970-01-01
    相关资源
    最近更新 更多