Python Numpy - 创建长度基于一维数组的二维数组

标签 python numpy vectorization

抱歉让标题困惑,但不确定如何让它更简洁。这是我的要求:

arr1 = np.array([3,5,9,1])
arr2 = ?(arr1)

arr2 将是:

[
[0,1,2,0,0,0,0,0,0],
[0,1,2,3,4,0,0,0,0],
[0,1,2,3,4,5,6,7,8],
[0,0,0,0,0,0,0,0,0]
]

它不需要根据最大值而变化,形状是预先知道的。所以开始我已经能够得到零的形状:

arr2 = np.zeros((len(arr1),max_len))

然后我当然可以像这样在 arr1 上做一个 for 循环:

for i, element in enumerate(arr1):
    arr2[i,0:element] = np.arange(element)

但这可能需要很长时间,而且这里的两个维度都相当大(arr1 是几百万行,max_len 大约是 500)。在 numpy 中是否有一种干净优化的方法来执行此操作?

最佳答案

基于 @Divakar 几年前发布的“填充”想法:

In [161]: res = np.arange(9)[None,:].repeat(4,0)
In [162]: res[res>=arr1[:,None]] = 0
In [163]: res
Out[163]: 
array([[0, 1, 2, 0, 0, 0, 0, 0, 0],
       [0, 1, 2, 3, 4, 0, 0, 0, 0],
       [0, 1, 2, 3, 4, 5, 6, 7, 8],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]])

关于Python Numpy - 创建长度基于一维数组的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70616556/

相关文章:

python - 有没有一种方法可以对计算 Spearman 相关性及其 p 值的嵌套循环进行矢量化?

Python 粘贴并在非 Python 源文件更改时自动重新启动

python - 如何将升序连续数字标记到列中的值上?

python - 将元组列表转换为 numpy 数组

python - 检查列表中元素的线性组合是否等于某个和的函数

r - 如何向量化用于排列的 for 循环?

python - 数组中所有值的索引

python - 在 Linux 中将 Python 2.7.6 降级到 Python 2.6

python - R lapply 在多列上与 Python 等效吗?

python - "only size-1 arrays can be converted to Python scalars"或 "` x0 ` must have at most 1 dimension"