numpy多维数组索引

时间:2015-02-18 15:00:34

标签: 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], :]

当然有效。

1 个答案:

答案 0 :(得分:2)

错误消息有点混乱,因为形状不匹配不在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,a.k.a。None对其进行切片:

    >>> k[numpy.array([1, 0])[:,None],m[:, 0]]
    array([[ 8, 10, 12, 14],
           [ 0,  2,  4,  6]])
    
  4. 还有很多其他的,但这些是最容易想到的三个。

    您收到错误是因为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]])