Python:遍历列表以填充numpy数组的优雅方式

Python:遍历列表以填充numpy数组的优雅方式,python,numpy,Python,Numpy,我正在寻找一种更优雅的方式来完成以下工作: filled_list = [1, 3, 54, 2, 8] new_list = [] for k in filled_list: new_k = # do some stuff new_list.append(new_k) converted_array = np.array(new_list) 迭代列表,但不使用索引 新的numpy数组的条目数将与新列表中的条目数完全相同 在我看来,最后的转换并不漂亮,我想防止这种情况

我正在寻找一种更优雅的方式来完成以下工作:

filled_list = [1, 3, 54, 2, 8]
new_list = []

for k in filled_list:
     new_k = # do some stuff
     new_list.append(new_k)

converted_array = np.array(new_list)
  • 迭代列表,但不使用索引
  • 新的numpy数组的条目数将与新列表中的条目数完全相同
  • 在我看来,最后的转换并不漂亮,我想防止这种情况发生,最好是从numpy数组开始。但是我需要迭代索引,这是我不想要的(因为这会使代码更庞大)
编辑:一些东西的例子

# previously filled: dict1, dict2, dict3, common_keys_of_all_dicts

list1 = []
list2 = []
list3 = []
for k in common_keys_of_all_dicts:
   list1.append(dict1[k].item1)
   list2.append(dict2[k].item2)
   list3.append(dict3[k].item3)
array1 = np.array(list1)
...

如果对某些东西没有明确的定义,我会选择:

def somestuff(k):
    return k * 42

converted_array = np.array([somestuff(k) for k in filled_list])

不要将起始列表作为列表类型使用。直接创建
filled_list
作为一个numpy数组,并直接在数组中执行所有操作。通常,所有类型的数学内容都可以直接在数组上完成。甚至更复杂的东西都是由numpy直接提供的。如果真的需要,可以迭代numpy数组

例如:

filled_list = np.array([1, 2, 3, 4, 5])
result = filled_list * filled_list + 1    #vectorized manipulation

for x in np.nditer(filled_list):          #iteration over array
    x = #do stuff here

我刚刚看到作者添加了一个不适用于初始numpy数组的示例。所以这个答案可能已经过时了。

如果你给出一些关于
#做一些花哨的事情的提示,这可能更容易回答。在某个步骤中,无论是隐式还是显式,你都必须将列表转换为numpy数组,因为你是从列表开始的。接下来的问题是,您是先转换为numpy数组,然后将“fancy stuff”操作矢量化,还是坚持当前格式。
converted_array=np.fromiter((fancy_stuff(k)表示填充列表中的k),dtype=…)
?如果是numpy数组,为什么说必须迭代索引?什么是花哨的东西?一般来说,您实际上是在接受numpy阵列的“最坏情况”场景。numpy阵列的主要特点是它支持矢量化(坦率地说,这是一个非常广泛的主题)。所以,如果你必须征求一般性的建议,我会说:不要迭代,写向量化逻辑,然后你可以从数组开始。正如你所看到的,这是模糊的,因为问题本身太宽泛了。请注意,我们不能提供一个适用于所有情况的矢量化答案,因为这样的东西并不总是存在的。生成器表达式只是“隐藏”了迭代,但它仍然存在;dr explore Vectoriation,没有什么灵丹妙药。数组上的迭代是一种反模式,避免迭代。是的,但有时不能将所有内容都放在一个表达式中进行矢量化数组操作。为什么建议使用
nditer
?这是否做了填充列表中x的普通
所不能做的事情:
我从来没有迭代过numpy数组,所以我只是在stackoverflow上搜索它。这是建议的方法。不知道一个数组是否可以像列表一样轻松迭代。是的,它们可以,@RaJa。