我有一个2D数组列表,我想知道是否可以一次将一个元素附加到所有列表而不通过双循环遍历所有元素。
我们说我有这个列表数组:
matrix_of_lists = np.array([[2,3],[1]],
[[2,5,4],[2,5]]])
我想做类似的事情:
matrix_of_lists[:].append(6)
matrix_of_lists = np.array([[2,3,6],[1,6]],
[[2,5,4,6],[2,5,6]]])
我知道如何使用两个循环,但我想优化/加速该过程。我的列表数组已经处于循环中并且非常大:1000 * 1000。
这可能是不可能的。谢谢。
答案 0 :(得分:1)
我怀疑你可以通过矢量化获得很多性能,因为你的数组最终会存储列表引用。但是这里有一种方法可以避免编写循环并适用于任意形状。
@np.vectorize
def append_vec(mat, elt):
mat.append(elt)
append_vec(matrix_of_lists, 1) # works inplace
# array([[list([2, 3, 1, 1]), list([1, 1])],
# [list([2, 5, 4, 1]), list([2, 5, 1])]], dtype=object)
不创建NaN
s数组的更好方法。
def append_vec(mat, elt):
mat.append(elt)
return None
append_vec = np.frompyfunc(append_vec, 2, 0)
答案 1 :(得分:1)
In [0]: matrix_of_lists = np.array([[[2,3],[1]],[[2,5,4],[2,5]]])
In [1]: foo = lambda l:l.append(6)
In [2]: vfunc = np.vectorize(foo)
In [3]: l = vfunc(matrix_of_lists)
In [4]: matrix_of_lists
Out[4]:
array([[list([2, 3, 6, 6]), list([1, 6])],
[list([2, 5, 4, 6]), list([2, 5, 6])]], dtype=object)