[英]Select from multiple slices in Numpy
說我們有
a = np.ones((3,3,3))
和
slices = [(0, 1, slice(None)), (0, slice(None), 0), (slice(None), 1, 0)]
有一個簡單的方法來選擇/變化值a
從slices
?
例如,我要指派0
到a
下切片這樣a
變
array([[[0., 1., 1.],
[0., 0., 0.],
[0., 1., 1.]],
[[1., 1., 1.],
[0., 1., 1.],
[1., 1., 1.]],
[[1., 1., 1.],
[0., 1., 1.],
[1., 1., 1.]]])
迭代的方法是做
for t in slices:
a[t] = 0
有沒有更好的方法來使用像np.r_
這樣的索引,就像 JoshAdel 在將值分配給 numpy 中的多個切片中使用的那樣?
我希望能達到像a[SLICES] = 0
,改變的一部分a
從每個切片slices
到0
。
你知道r_
是做什么的嗎? 它將切片轉換為范圍,然后將整個混亂連接在一起。
我不知道您是否可以使用r_
或類似的東西來構建所需的索引。 但:
In [168]: idx = np.where(a==0)
In [169]: idx
Out[169]:
(array([0, 0, 0, 0, 0, 1, 2]),
array([0, 1, 1, 1, 2, 1, 1]),
array([0, 0, 1, 2, 0, 0, 0]))
這讓我們了解所需的索引數組(減去一些可能的重復項)。
可以將這 3 個ogrid
列表連接成一個組合:
In [181]: np.ogrid[0:1,1:2,:3]
Out[181]: [array([[[0]]]), array([[[1]]]), array([[[0, 1, 2]]])]
In [182]: np.ogrid[0:1,:3,0:1]
Out[182]:
[array([[[0]]]), array([[[0],
[1],
[2]]]), array([[[0]]])]
In [183]: np.ogrid[:3,1:2,0:1]
Out[183]:
[array([[[0]],
[[1]],
[[2]]]), array([[[1]]]), array([[[0]]])]
他們單獨選擇 0 中a
.
將它們轉換為它們的等價物並加入生成的一維數組可能是最簡單的。
In [188]: np.ravel_multi_index(Out[181],(3,3,3))
Out[188]: array([[[3, 4, 5]]])
etc
In [195]: np.hstack([Out[188].ravel(), Out[189].ravel(), Out[190].ravel()])
Out[195]: array([ 3, 4, 5, 0, 3, 6, 3, 12, 21])
In [197]: a.flat[_]
Out[197]: array([0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [199]: np.unravel_index(Out[195],(3,3,3))
Out[199]:
(array([0, 0, 0, 0, 0, 0, 0, 1, 2]),
array([1, 1, 1, 0, 1, 2, 1, 1, 1]),
array([0, 1, 2, 0, 0, 0, 0, 0, 0]))
Out[169]
和Out[199]
具有相同的值,但重復項除外。
這是連接幾個一維切片問題的概括。 索引然后連接所花費的時間與先連接索引所花費的時間差不多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.