Die*_*rdo 3 python arrays numpy rows padding
我有一个不同行大小的 numpy 数组
a = np.array([[1,2,3,4,5],[1,2,3],[1]])
Run Code Online (Sandbox Code Playgroud)
我想把它变成一个密集的(固定的 nxm 大小,没有可变的行)矩阵。直到现在我尝试过这样的事情
size = (len(a),5)
result = np.zeros(size)
result[[0],[len(a[0])]]=a[0]
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误告诉我
形状不匹配:形状 (5,) 的值数组无法广播到形状 (1,) 的索引结果
我也尝试使用 np.pad 进行填充,但根据 numpy.pad 的文档,似乎我需要在 pad_width 中指定行的先前大小(这是可变的,并在尝试使用 -1,0 时产生错误) , 和最大的行大小)。
我知道我可以像这里显示的那样为每行填充填充列表,但是我需要使用更大的数据数组来做到这一点。
如果有人可以帮助我回答这个问题,我会很高兴知道。
真的没有办法填充锯齿状数组,使其失去锯齿状,而不必遍历数组的行。您甚至必须对数组进行两次迭代:一次是为了找出您需要填充的最大长度,另一个是实际进行填充。
您链接到的代码提案将完成工作,但效率不高,因为它在迭代行元素的 python for 循环中添加零,而该附加可能已预先计算,从而推动更多将该代码转换为 C。
下面的代码预先计算了一个所需最小维度的数组,用零填充,然后简单地将锯齿状数组 M 中的行添加到位,这样效率更高。
import random
import numpy as np
M = [[random.random() for n in range(random.randint(0,m))] for m in range(10000)] # play-data
def pad_to_dense(M):
"""Appends the minimal required amount of zeroes at the end of each
array in the jagged array `M`, such that `M` looses its jagedness."""
maxlen = max(len(r) for r in M)
Z = np.zeros((len(M), maxlen))
for enu, row in enumerate(M):
Z[enu, :len(row)] += row
return Z
Run Code Online (Sandbox Code Playgroud)
给你一些关于速度的想法:
from timeit import timeit
n = [10, 100, 1000, 10000]
s = [timeit(stmt='Z = pad_to_dense(M)', setup='from __main__ import pad_to_dense; import numpy as np; from random import random, randint; M = [[random() for n in range(randint(0,m))] for m in range({})]'.format(ni), number=1) for ni in n]
print('\n'.join(map(str,s)))
# 7.838103920221329e-05
# 0.0005027339793741703
# 0.01208890089765191
# 0.8269036808051169
Run Code Online (Sandbox Code Playgroud)
如果您想在数组前面加上零,而不是追加,那么对代码进行一个足够简单的更改,我将留给您。
归档时间: |
|
查看次数: |
6698 次 |
最近记录: |