如何用另一个ndarray索引一个ndarray?

时间:2019-01-31 00:29:46

标签: python numpy

我做一些机器学习在东西蟒/ numpy的在其中欲索引与1-d ndarray 2维ndarray,使我获得与索引值1-d阵列。

我让它可以处理一些丑陋的代码,我想知道是否有更好的方法,因为对于像python + numpy这样的好语言和模块组合来说,这似乎是不自然的。

   a = np.arange(50).reshape(10, 5) # Array to be indexed
   b = np.arange(9, -1, -2) # Indexing array
   print(a)
   print(b)
   print(a[b, np.arange(0, a.shape[1]).reshape(1,a.shape[1])])
   #Prints:
   [[ 0  1  2  3  4]
    [ 5  6  7  8  9]
    [10 11 12 13 14]
    [15 16 17 18 19]
    [20 21 22 23 24]
    [25 26 27 28 29]
    [30 31 32 33 34]
    [35 36 37 38 39]
    [40 41 42 43 44]
    [45 46 47 48 49]]

   [9 7 5 3 1]

   [[45 36 27 18  9]]

这正是我想要的(即使从技术上讲是二维ndarray),但这似乎非常复杂。有没有更整洁的方式?

编辑: 为了澄清,我其实我不想要一个1-d阵列,这是解释很差。实际上,我确实想要一个长度为1的维,因为这是以后处理它所需要的,但是使用reshape()语句可以轻松实现。抱歉,我只是将实际代码与更笼统的问题混在一起了。

2 个答案:

答案 0 :(得分:0)

您可以只使用np.diagonal来获得想要的东西。无需reshape或索引。这里最棘手的部分是确定要获取的模式,该模式基本上是a[b]矩阵的对角元素。

a = np.arange(50).reshape(10, 5) # Array to be indexed
b = np.arange(9, -1, -2) # Indexing array
print (np.diagonal(a[b]))
# [45 36 27 18  9]

正如@ user2357112在评论中提到的,np.diagonal的返回是只读的。我认为,如果您计划将值附加/修改到此最终所需列表中,将是一个问题。如果您只想打印它们或将它们用于其他索引,就可以了。

按照docs

  

从NumPy 1.9开始,它返回原始数组上的只读视图。尝试写入结果数组将产生错误。

     

在将来的发行版中,它将返回一个读/写视图,写入返回的数组将更改您的原始数组。返回的数组将具有与输入数组相同的类型。

     

如果您不写此函数返回的数组,则可以忽略以上所有内容。

答案 1 :(得分:0)

您想要一个1D数组,但是您包含了一个reshape调用,其唯一目的是将数组从所需格式转换为不需要的格式。

停止重塑arange输出。另外,您无需明确指定0起始值:

result = a[b, np.arange(a.shape[1])]