我做一些机器学习在东西蟒/ 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()
语句可以轻松实现。抱歉,我只是将实际代码与更笼统的问题混在一起了。
答案 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])]