gpt4 book ai didi

python - 一维 numpy 数组,对于新二维数组中的每个连续行向右移动

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

我正在尝试通过删除 for 循环并仅在处理大型数据集时使用 numpy 数组来优化一些代码。

我想采用一维 numpy 数组,例如:

a = [1, 2, 3, 4, 5]

并生成一个 2D numpy 数组,其中每列中的值沿一个位置移动,例如在上面的情况下,我希望有一个返回的函数:

[[1 2 3 4 5]
[0 1 2 3 4]
[0 0 1 2 3]
[0 0 0 1 2]
[0 0 0 0 1]]

我找到了使用 strides 函数来做一些类似于 produce 的例子,例如:

[[1 2 3]
[2 3 4]
[3 4 5]]

但是我试图将我的每一列都移到另一个方向。或者,可以将问题视为将 a 的第一个元素放在第一对角线上,将第二个元素放在第二对角线上,依此类推。但是,我想再次强调我是如何避免完全使用 for、while 或 if 循环的。任何帮助将不胜感激。

最佳答案

这样的矩阵是 Toeplitz matrix 的一个例子.你可以使用 scipy.linalg.toeplitz创建它:

In [32]: from scipy.linalg import toeplitz

In [33]: a = range(1,6)

In [34]: toeplitz(a, np.zeros_like(a)).T
Out[34]:
array([[1, 2, 3, 4, 5],
[0, 1, 2, 3, 4],
[0, 0, 1, 2, 3],
[0, 0, 0, 1, 2],
[0, 0, 0, 0, 1]])

受@EelcoHoogendoorn 的回答启发,这里有一个变体,它使用的内存不如scipy.linalg.toeplitz:

In [47]: from numpy.lib.stride_tricks import as_strided

In [48]: a
Out[48]: array([1, 2, 3, 4, 5])

In [49]: t = as_strided(np.r_[a[::-1], np.zeros_like(a)], shape=(a.size,a.size), strides=(a.itemsize, a.itemsize))[:,::-1]

In [50]: t
Out[50]:
array([[1, 2, 3, 4, 5],
[0, 1, 2, 3, 4],
[0, 0, 1, 2, 3],
[0, 0, 0, 1, 2],
[0, 0, 0, 0, 1]])

结果应被视为“只读”数组。否则,当您更改元素时,您会遇到一些意外。例如:

In [51]: t[0,2] = 99

In [52]: t
Out[52]:
array([[ 1, 2, 99, 4, 5],
[ 0, 1, 2, 99, 4],
[ 0, 0, 1, 2, 99],
[ 0, 0, 0, 1, 2],
[ 0, 0, 0, 0, 1]])

关于python - 一维 numpy 数组,对于新二维数组中的每个连续行向右移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21028332/

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