如何确定numpy中包含"None"和“:”的切片?
How to determine slices that contains "None" and ":" in numpy?
我正在做 itertools.product
的替代练习,我的方法是使用 np.broadcast
:
import numpy as np
x = np.array([4,3,1])
y = np.array([2,4,0])
z = np.array([0,1,2])
ix = np.broadcast(x[:,None,None], y[None,:,None], z[None, None, :])
print(*ix)
这次它工作正常,但如果我愿意,如何以自动方式创建所有这些“眼睛排列”的新轴,比如 7 个维度,如下所示:
[:,None,None,None,None,None,None]
[None,:,None,None,None,None,None]
[None,None,:,None,None,None,None]
[None,None,None,:,None,None,None]
[None,None,None,None,:,None,None]
[None,None,None,None,None,:,None]
[None,None,None,None,None,None,:]
我希望像 np.ix_ 这样的东西允许在分配这些切片时使用所有这些 None
和 :
。
每个索引都是一个 n
元素元组。每个元组的对角元素,即第i
元组的第i
元素,是一个slice
对象。具体来说,:
是 slice(None)
的缩写。 (一般来说,x:y:z
是对象 slice(x, y, z)
,任何缺少的元素都是 None
,但至少必须提供一个参数)。
arguments = [(None,)*i + (slice(None),) + (None,)*(6-i) for i in range(7)]
# E.g., i == 0 -> () + (slice(None),) + (None, None, None, None, None, None)
# == (slice(None), None, None, None, None, None, None)
ix = np.broadcast(*(x[arg] for arg in arguments))
方法 #1
同样的 eye-arrangement 可用于重塑所有参与的数组 -
A = [x,y,z] # all arrays
s = 1-2*np.eye(len(A), dtype=int)
out = [a.reshape(i) for i,a in zip(s,A)]
这是使用 s
塑造的技巧部分:
In [53]: s
Out[53]:
array([[-1, 1, 1], # reshape to keep all axes singleton except first
[ 1, -1, 1], # .. second
[ 1, 1, -1]]) # ... third
因此,考虑 [-1, 1, 1]
是重塑以保持除第一个以外的所有轴单独。这与 [:,None,None]
等相同。
方法 #2
使用相同的eye-arrangement得到一个索引器-
idx = np.where(np.eye(len(A)), Ellipsis, None)
out = [a[tuple(i)] for a,i in zip(A,idx)]
索引器是:
In [77]: idx
Out[77]:
array([[Ellipsis, None, None],
[None, Ellipsis, None],
[None, None, Ellipsis]], dtype=object)
我正在做 itertools.product
的替代练习,我的方法是使用 np.broadcast
:
import numpy as np
x = np.array([4,3,1])
y = np.array([2,4,0])
z = np.array([0,1,2])
ix = np.broadcast(x[:,None,None], y[None,:,None], z[None, None, :])
print(*ix)
这次它工作正常,但如果我愿意,如何以自动方式创建所有这些“眼睛排列”的新轴,比如 7 个维度,如下所示:
[:,None,None,None,None,None,None]
[None,:,None,None,None,None,None]
[None,None,:,None,None,None,None]
[None,None,None,:,None,None,None]
[None,None,None,None,:,None,None]
[None,None,None,None,None,:,None]
[None,None,None,None,None,None,:]
我希望像 np.ix_ 这样的东西允许在分配这些切片时使用所有这些 None
和 :
。
每个索引都是一个 n
元素元组。每个元组的对角元素,即第i
元组的第i
元素,是一个slice
对象。具体来说,:
是 slice(None)
的缩写。 (一般来说,x:y:z
是对象 slice(x, y, z)
,任何缺少的元素都是 None
,但至少必须提供一个参数)。
arguments = [(None,)*i + (slice(None),) + (None,)*(6-i) for i in range(7)]
# E.g., i == 0 -> () + (slice(None),) + (None, None, None, None, None, None)
# == (slice(None), None, None, None, None, None, None)
ix = np.broadcast(*(x[arg] for arg in arguments))
方法 #1
同样的 eye-arrangement 可用于重塑所有参与的数组 -
A = [x,y,z] # all arrays
s = 1-2*np.eye(len(A), dtype=int)
out = [a.reshape(i) for i,a in zip(s,A)]
这是使用 s
塑造的技巧部分:
In [53]: s
Out[53]:
array([[-1, 1, 1], # reshape to keep all axes singleton except first
[ 1, -1, 1], # .. second
[ 1, 1, -1]]) # ... third
因此,考虑 [-1, 1, 1]
是重塑以保持除第一个以外的所有轴单独。这与 [:,None,None]
等相同。
方法 #2
使用相同的eye-arrangement得到一个索引器-
idx = np.where(np.eye(len(A)), Ellipsis, None)
out = [a[tuple(i)] for a,i in zip(A,idx)]
索引器是:
In [77]: idx
Out[77]:
array([[Ellipsis, None, None],
[None, Ellipsis, None],
[None, None, Ellipsis]], dtype=object)