替换numpy数组列表中的值

时间:2019-03-12 14:10:20

标签: python numpy

我需要生成两个数组列表: 每个列表将包含一维数组,但是每个一维数组的长度可能不同。 第一个列表将包含一些有意义的值。 第二个列表的形状必须完全相同,但只能包含一个。

生成第一个数组的代码:

myarray=[]
rowcount=3
elements_per_row=[2,3,5]
for i in range (0,rowcount):
    elements=elements_per_row[i]
    temparray=np.random.randn(elements)
    myarray.append(temparray)

上面代码的输出将是一个数组列表(即3个具有2,3,5个元素的数组,用随机数填充)。

我有两个问题:

  1. 是否有其他更优雅/矢量化/计算更快的方式来生成第一个列表(数组数组也可以)?

  2. 生成一个形状完全相同但填充了一个数组的列表:

我确实了解最直接的方法:只需在开头添加一个数组,然后将其填充为np.ones。 “ Bruteforce”方法将是:

myarray=[]
arrayofones=[]
rowcount=3
elements_per_row=[2,3,5]
for i in range (0,rowcount):
    elements=elements_per_row[i]

    #generating meaningful values
    temparray=np.random.randn(elements)
    myarray.append(temparray)

    # generating ones
    temparray=np.ones(elements)
    arrayofones.append(temparray)

但是,如果给定myarray作为输入,而我仍然需要获取一个由1组成的数组的列表,会有什么更好的方法?

2 个答案:

答案 0 :(得分:0)

对于第一次创建数组,您可以将代码简化为:

import numpy as np

elements_per_row = [2, 3, 5]
myarray = [np.random.randn(elements) for elements in elements_per_row]

要创建形状相同的数组,只需执行以下操作:

arrayofones = [np.ones_like(array) for array in myarray]

原则上,没有更多的矢量化方法可以执行此操作,因为NumPy数组不能具有大小不同的切片。最接近的事情可能是使用masked array

import numpy as np

np.random.seed(100)
elements_per_row = np.array([2, 3, 5])
max_elements = elements_per_row.max()
data = np.random.randn(len(elements_per_row), max_elements)
mask = np.arange(max_elements) >= elements_per_row[:, np.newaxis]
myarray = np.ma.array(data, mask=mask)
print(myarray)
# [[-1.7497654730546974 0.34268040332750216 -- -- --]
#  [0.5142188413943821 0.22117966922140045 -1.0700433305682933 -- --]
#  [-0.4580269855026243 0.43516348812289213 -0.5835950503226648
#   0.816847071685779 0.672720805709661]]
arrayofones = np.ones_like(myarray)
print(arrayofones)
# [[1.0 1.0 -- -- --]
#  [1.0 1.0 1.0 -- --]
#  [1.0 1.0 1.0 1.0 1.0]]

根据您的用例,使用带掩码的数组可能会使事情变得更容易或更麻烦。

答案 1 :(得分:0)

您可以使用列表推导:

您的代码:

import numpy as np

myarray=[]
arrayofones=[]
rowcount=3
elements_per_row=[2,3,5]
for i in range (0,rowcount):
    elements=elements_per_row[i]
    #generating meaningfull values
    temparray=np.random.randn(elements)
    myarray.append(temparray)
    # generating ones
    temparray=np.ones(elements)
    arrayofones.append(temparray)
Execution time: 40 µs ± 2.11 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

列表理解(您可以输入myarray作为输入):

elements_per_row=[2,3,5]
myarray = [np.random.randn(elements) for elements in elements_per_row]
arrayofones = [np.ones_like(a) for a in myarray]
Execution time: 29.1 µs ± 492 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)