NumPy:如何将一维数组转换和重塑为二维数组并用零填充?

4

我该如何将以下列表转换和重塑为包含零的二维数组?

# original list 
[1, 0.96, 0.92, 0.88]

# 2D Array
[[1     0     0     0   ]
 [0.96  1     0     0   ]
 [0.92  0.96  1     0   ]
 [0.88  0.92  0.96  1   ]]

能否请您解释一下?将一维转换为二维并不是什么大问题,但您想要的输出似乎有些含义。 - Innat
一个二维数组中的浮点数需要遵循一些规则吗? - Innat
我想使用二维数组作为点积运算的一部分,以便与另一个数组一起测量衰减。没有规定,只需确保浮点值保留两位小数。 - Shantanu
@M.Innat 规则非常明显...1D向量在每一列中重复出现,每一列向下移动一个单位并裁剪最后一个值。您是否尝试使用for循环展示过程,然后再要求进行矢量化实现? - Mathieu
for循环会很慢,因此检查是否有一些奇妙的方法可以在NumPy本身中完成。 - Shantanu
@Shantanu,已发布的解决方案有没有起作用? - Divakar
3个回答

4
这里有一种新颖的向量化方法。我们可以利用基于 np.lib.stride_tricks.as_stridedscikit-image's view_as_windows 来获取滑动窗口视图并解决它。
from skimage.util.shape import view_as_windows

# a is input array (convert to array with np.array() is input is list)
p = np.r_[a[::-1], np.zeros(len(a)-1, dtype=a.dtype)]
out = view_as_windows(p,len(a))[::-1]

或者将其保持原生的NumPy -

m = len(a)
n = p.strides[0]
out = np.lib.stride_tricks.as_strided(p[m-1:], shape=(m,m), strides=(-n,n))

有趣,真的很时髦 ;) - Innat

2

使用for循环的正确实现方法是:

import numpy as np

A = np.array([1, 0.96, 0.92, 0.88])
B = np.zeros((A.shape[0], A.shape[0]))

for i in range(A.shape[0]):
    B[i:, i] = A[:A.shape[0]-i]

有一种向量化的方法可以提高效率并摆脱for循环。有人有想法吗?

我发现了这篇SO帖子,它相对类似,并且有许多向量化的实现:Sliding window of M-by-N shape numpy.ndarray


我发现 view_as_windows(1.42秒)比你的解决方案,即 for 循环(100毫秒),慢得多。 - Innat
@M.Innat 这是不可能的。再检查一下?除非你是在对四个元素的数据进行基准测试? - Divakar
@M.Innat 这完全取决于数据数组的大小。对于一个4x4的数组,for循环并不会很慢,但如果你增加大小,向量化实现将更快。 - Mathieu

1
以下内容适用于您:

以下是针对您的工作的操作:

import numpy as np 

arr = np.array([1, 0.96, 0.92, 0.88])

arr_cp = np.zeros((arr.shape[0], arr.shape[0]))

for i in range(arr.shape[0]):
  arr_cp[i][:i+1] = np.flip(arr[:i+1])

print(arr_cp)

输出:

[[1.   0.   0.   0.  ]
 [0.96 1.   0.   0.  ]
 [0.92 0.96 1.   0.  ]
 [0.88 0.92 0.96 1.  ]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接