gpt4 book ai didi

python - 分配给 numpy 数组的包装切片

转载 作者:太空宇宙 更新时间:2023-11-03 13:35:39 25 4
gpt4 key购买 nike

我有一个大图像 A 和一个较小的图像 B,它们都表示为二维 numpy 数组。我想使用 A 作为 Canvas ,并在上面写下 B 的翻译副本,以六边形排列。我无法理解的部分是如何处理它,使图像在垂直和水平方向都环绕——本质上,我想要的是将子图像(根据需要填充)规则镶嵌到圆环上。

我看过关于 numpy.takenumpy.roll 的讨论 wrapping around slices in Python / numpy这向我展示了如何访问和返回数组的包装切片的副本,但我想分配给它——即,对于任意整数 rowOffset columnOffset 我想做的是:

  A = numpy.zeros((5,11), int)
B = numpy.array([[1,2,3,4,5,6,7]]) * numpy.array([[10,100,1000]]).T
# OK, we wouldn't be able to fit more than one or two copies of B into A, but they demonstrate the wrapped placement problem

wrappedRowIndices = ( numpy.arange(B.shape[0]) + rowOffset ) % A.shape[0]
wrappedColumnIndices = ( numpy.arange(B.shape[1]) + columnOffset ) % A.shape[1]
A[ wrappedRowIndices, : ][ :, wrappedColumnIndices ] = B

我从评论中看到on the question ,并且从对 numpy 数组表示方式的片刻反射(reflection)来看,包装切片无法以这种要求的方式作为 view 返回。

是否有 (Y) 以这种方式分配给数组的包裹切片的方法,或者 (X) 是否有用于执行我试图实现的那种分割的现有实用程序?

最佳答案

np.put是一维等于 np.take :

In [1270]: A=np.arange(10)
In [1271]: np.take(A,[8,9,10,11],mode='wrapped')
Out[1271]: array([8, 9, 0, 1])
In [1272]: np.put(A,[8,9,10,11],[10,11,12,13],mode='wrapped')
In [1273]: A
Out[1273]: array([12, 13, 2, 3, 4, 5, 6, 7, 10, 11])
In [1274]: np.take(A,[8,9,10,11],mode='wrapped')
Out[1274]: array([10, 11, 12, 13])

它的文档建议 np.placenp.putmask (和 np.copyto )。我用的不多,但可以构建一个掩码,并重新排列 B这样就可以复制了。

=================

这是一个关于 place 的实验:

In [1313]: A=np.arange(24).reshape(4,6)
In [1314]: mask=np.zeros(A.shape,bool)
In [1315]: mask[:3,:4]=True
In [1316]: B=-np.arange(12).reshape(3,4)

所以我有 maskA 大小相同, 有一个大小为 B 的“洞” .

我可以同时滚动 maskB , 和 place A 中的值在wrapped时尚。

In [1317]: np.place(A, np.roll(mask,-2,0), np.roll(B,1,0).flat)
In [1318]: A
Out[1318]:
array([[ -8, -9, -10, -11, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[ 0, -1, -2, -3, 16, 17],
[ -4, -5, -6, -7, 22, 23]])

还有 2d 卷

In [1332]: m=np.roll(np.roll(mask,-2,0),-1,1)
In [1333]: m
Out[1333]:
array([[ True, True, True, False, False, True],
[False, False, False, False, False, False],
[ True, True, True, False, False, True],
[ True, True, True, False, False, True]], dtype=bool)
In [1334]: b=np.roll(np.roll(B,1,0),-1,1)
In [1335]: b
Out[1335]:
array([[ -9, -10, -11, -8],
[ -1, -2, -3, 0],
[ -5, -6, -7, -4]])
In [1336]: A=np.zeros((4,6),int)
In [1337]: np.place(A, m, b.flat)
In [1338]: A
Out[1338]:
array([[ -9, -10, -11, 0, 0, -8],
[ 0, 0, 0, 0, 0, 0],
[ -1, -2, -3, 0, 0, 0],
[ -5, -6, -7, 0, 0, -4]])

关于python - 分配给 numpy 数组的包装切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40228020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com