python - numpy 多维数组索引

标签 python numpy multidimensional-array indexing

当我在 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], :]

当然可以。

最佳答案

错误消息有点困惑,因为形状不匹配不在 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. 将其转换为数组并 reshape 数组:

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

关于python - numpy 多维数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28586700/

相关文章:

python - 在 pyspark 中,为什么 `limit` 后跟 `repartition` 创建完全相等的分区大小?

python - API测试自动化框架结构

python-3.x - 试图 reshape 我的 numpy 数组以获得额外的维度

python - 有条件地交换多维列表Python的for循环中的轴

java - 将列表转换为二维数组 (Java)

python - 以字符串元组作为索引的 Pandas DataFrame

python - 使用 Python 和 NumPy 的神经网络

python - 当图像转换为 numpy 数组时如何调整图像大小

java - 使用 while 循环而不是 for 循环创建二维数组以提高运行时效率

python - Python 中的事件监听和处理