[英]selecting numpy array axis by int
I am trying to access systematically a numpy array's axis. 我试图系统地访问一个numpy数组的轴。 For example, suppose I have an array 例如,假设我有一个数组
a = np.random.random((10, 10, 10, 10, 10, 10, 10))
# choosing 7:9 from axis 2
b = a[:, :, 7:9, ...]
# choosing 7:9 from axis 3
c = a[:, :, :, 7:9, ...]
Typing colons gets very repetitive if I have a high dimensional array. 如果我有一个高维数组,键入冒号会非常重复。 Now, I want some function choose_from_axis
such that 现在,我想要一些函数choose_from_axis
这样
# choosing 7:9 from axis 2
b = choose_from_axis(a, 2, 7, 9)
# choosing 7:9 from axis 3
c = choose_from_axis(a, 3, 7, 9)
So, basically, I want to access an axis with a number. 所以,基本上,我想访问一个带数字的轴。 The only way I know how to do this is to use rollaxis
back and forth, but I am looking for a more direct way to do it. 我知道如何做到这一点的唯一方法是来回使用rollaxis
,但我正在寻找更直接的方法来做到这一点。
Sounds like you may be looking for take : 听起来像是你可能会寻找起飞 :
>>> a = np.random.randint(0,100, (3,4,5))
>>> a[:,1:3,:]
array([[[61, 4, 89, 24, 86],
[48, 75, 4, 27, 65]],
[[57, 55, 55, 6, 95],
[19, 16, 4, 61, 42]],
[[24, 89, 41, 74, 85],
[27, 84, 23, 70, 29]]])
>>> a.take(np.arange(1,3), axis=1)
array([[[61, 4, 89, 24, 86],
[48, 75, 4, 27, 65]],
[[57, 55, 55, 6, 95],
[19, 16, 4, 61, 42]],
[[24, 89, 41, 74, 85],
[27, 84, 23, 70, 29]]])
This will also give you support for tuple indexing. 这也将为您提供元组索引的支持。 Example: 例:
>>> a = np.arange(2*3*4).reshape(2,3,4)
>>> a
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]]])
>>> a[:,:,(0,1,3)]
array([[[ 0, 1, 3],
[ 4, 5, 7],
[ 8, 9, 11]],
[[12, 13, 15],
[16, 17, 19],
[20, 21, 23]]])
>>> a.take((0,1,3), axis=2)
array([[[ 0, 1, 3],
[ 4, 5, 7],
[ 8, 9, 11]],
[[12, 13, 15],
[16, 17, 19],
[20, 21, 23]]])
You could construct a slice object that does the job: 您可以构造一个执行该作业的切片对象:
def choose_from_axis(a, axis, start, stop):
s = [slice(None) for i in range(a.ndim)]
s[axis] = slice(start, stop)
return a[s]
For example, the following both give the same result: 例如,以下两者给出相同的结果:
x[:,1:2,:]
choose_from_axis(x, 1, 1, 2)
# [[[ 3 4 5]]
# [[12 13 14]]
# [[21 22 23]]]
as does the example in the question: 和问题中的例子一样:
a = np.random.random((10, 10, 10, 10, 10, 10, 10))
a0 = a[:, :, 7:9, ...]
a1 = choose_from_axis(a, 2, 7, 9)
print np.all(a0==a1) # True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.