我该如何将以下列表转换和重塑为包含零的二维数组?
# 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 ]]
我该如何将以下列表转换和重塑为包含零的二维数组?
# 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 ]]
np.lib.stride_tricks.as_strided
的 scikit-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))
使用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以下是针对您的工作的操作:
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. ]]