如何将以下列表转换为0并将其重塑为2D数组?
# 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 ]]
答案 0 :(得分:4)
这是一种时髦的矢量化方式。我们可以利用基于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))
答案 1 :(得分:2)
使用random_walker
循环的正确实现是:
for
应该有一种矢量化方法,并摆脱for循环的效率。任何人都有想法吗?
我发现这则SO帖子相对相似,并且有很多矢量化实现:Sliding window of M-by-N shape numpy.ndarray
答案 2 :(得分: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. ]]