【问题标题】:Numpy Indexing BehaviorNumpy 索引行为
【发布时间】:2016-04-25 21:36:52
【问题描述】:

我在理解多维数组的 numpy 索引时遇到了很多麻烦。在我正在使用的这个示例中,假设我有一个 2D 数组 A,它是 100x10。然后我有另一个数组 B,它是一个 100x1 一维数组,包含 0-9 之间的值(A 的索引)。在 MATLAB 中,我将使用 A(sub2ind(size(A), 1:size(A,1)', B) 为 A 的每一行返回存储在 B 的相应行中的索引处的值。

所以,作为一个测试用例,假设我有这个:

A = np.random.rand(100,10)
B = np.int32(np.floor(np.random.rand(100)*10))

如果我打印它们的形状,我会得到:

print A.shape returns (100L, 10L)
print B.shape returns (100L,)

当我尝试天真地(错误地)使用 B 对 A 进行索引时

Test1 = A[:,B]
print Test1.shape returns (100L, 100L)

如果我这样做了

Test2 = A[range(A.shape[0]),B]
print Test2.shape returns (100L,)

这就是我想要的。我无法理解这里所做的区分。在我看来, A[:,5] 和 A[range(A.shape[0]),5] 应该返回相同的东西,但它不在这里。 : 与使用 range(sizeArray) 有什么不同,range(sizeArray) 只是从 [0:sizeArray] (含)创建一个数组以使用索引?

【问题讨论】:

标签: numpy indexing


【解决方案1】:

我们来看一个简单的数组:

In [654]: X=np.arange(12).reshape(3,4)
In [655]: X
Out[655]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

通过切片,我们可以选择 3 列 X,以任意顺序(甚至重复)。换句话说,取所有行,但选择列。

In [656]: X[:,[3,2,1]]
Out[656]: 
array([[ 3,  2,  1],
       [ 7,  6,  5],
       [11, 10,  9]])

如果我使用 3 个值的列表(或数组),它会将它们与列值配对,有效地选择 3 个值,X[0,3],X[1,2],X[2,1]

In [657]: X[[0,1,2],[3,2,1]]
Out[657]: array([3, 6, 9])

如果我给它一个列向量来索引行,我会得到与切片相同的结果:

In [659]: X[[[0],[1],[2]],[3,2,1]]
Out[659]: 
array([[ 3,  2,  1],
       [ 7,  6,  5],
       [11, 10,  9]])

这相当于选择 9 个单独的值,由广播生成:

In [663]: np.broadcast_arrays(np.arange(3)[:,None],np.array([3,2,1]))
Out[663]: 
[array([[0, 0, 0],
        [1, 1, 1],
        [2, 2, 2]]), 
 array([[3, 2, 1],
        [3, 2, 1],
        [3, 2, 1]])]

numpy 索引可能会造成混淆。但是一个很好的起点是这个页面:http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

【讨论】:

    猜你喜欢
    • 2017-05-05
    • 2013-11-15
    • 2019-10-11
    • 2013-09-17
    • 1970-01-01
    • 2018-05-11
    • 2018-05-02
    • 2015-08-16
    • 2013-09-26
    相关资源
    最近更新 更多