如何解决从零和给定的一维数组构建自定义数组
我有一个列表,我想从[90,50,10]
来构建内核
我想要做的是获得一个看起来像--p的内核
[[90,0]
[50,0]
[10,0]
[0,90,10,90]
[0,50]
[0,10]]
我可以使用循环来实现它,并且我尝试按照此代码做某事-
k = np.array([90,10])
for i in k:
d = np.zeros((3,3))
np.fill_diagonal(d,i)
print(d)
[[90. 0. 0.]
[ 0. 90. 0.]
[ 0. 0. 90.]]
[[50. 0. 0.]
[ 0. 50. 0.]
[ 0. 0. 50.]]
[[10. 0. 0.]
[ 0. 10. 0.]
[ 0. 0. 10.]]
问题是要对行进行重新排序,我将需要另一次迭代,而np.fill_diagonal是一种就地方法,因此我无法使用列表推导。
我正在寻找一种方法,可以使用矢量化方式解决此问题,而无需使用任何循环,仅使用numpy并使用一行代码即可。
编辑:
如果我使用[90,40,30,10]
之类的5X1阵列,则首选解决方案应该能够构建25X5内核
解决方法
您可以这样做:
s = np.array([90,50,10])
size = s.size
o = np.zeros((size ** 2,s.size))
o[np.arange(size**2),np.repeat(np.arange(size),size)] = np.tile(s,size)
print(o)
[[90. 0. 0.]
[50. 0. 0.]
[10. 0. 0.]
[ 0. 90. 0.]
[ 0. 50. 0.]
[ 0. 10. 0.]
[ 0. 0. 90.]
[ 0. 0. 50.]
[ 0. 0. 10.]]
,
这是一种可能的单线,例如k = np.array([90,10])
:
np.concatenate([np.pad(k[:,None],((0,0),(i,2-i))) for i in range(k.size)])
,
IIUC,
#k = np.array([90,10])
kernel = np.tile(np.identity(k.shape[0])*k,k.shape[0]).reshape(k.shape[0]**2,k.shape[0])
print(kernel)
[[90. 0. 0.]
[90. 0. 0.]
[90. 0. 0.]
[ 0. 50. 0.]
[ 0. 50. 0.]
[ 0. 50. 0.]
[ 0. 0. 10.]
[ 0. 0. 10.]
[ 0. 0. 10.]]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。