gpt4 book ai didi

python - 替换 numpy 数组列表中的值

转载 作者:太空宇宙 更新时间:2023-11-03 21:10:09 24 4
gpt4 key购买 nike

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

生成第一个数组的代码:

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. 生成形状完全相同的数组列表,但用 1 填充:

我确实理解最直接的方法:只需在开头再添加一个数组,并用 np.ones 填充它。“暴力”方法将是:

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 的数组列表,那么更好的方法是什么?

最佳答案

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

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]]

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

关于python - 替换 numpy 数组列表中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55123518/

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