我想创建一个1D NumPy数组,其由另一个1D数组的1000个相邻重复组成,而不是复制数据1000次。
这是否可能?
如果有帮助的话,我打算将两个数组都视为不可变。
我想创建一个1D NumPy数组,其由另一个1D数组的1000个相邻重复组成,而不是复制数据1000次。
这是否可能?
如果有帮助的话,我打算将两个数组都视为不可变。
你不能这样做;一个 NumPy 数组必须沿着每个维度具有一致的步幅,而你的步长大部分时间都需要朝着一个方向前进,但有时会往后跳。
最接近的解决方案是创建一个 1000 行的二维数组,其中每一行都是你第一个数组的视图,或者使用 flatiter
对象,该对象的行为类似于一个一维数组。flatiters 支持迭代和索引,但是你无法对它们进行视图操作;所有的索引都会创建一个副本。
设置:
import numpy as np
a = np.arange(10)
2D 视图:
b = np.lib.stride_tricks.as_strided(a, (1000, a.size), (0, a.itemsize))
迭代器对象:
c = b.flat
b.flat
还是b.flatten()
? - Benjaminb.flat.base is b
是 True;b.flatten().base is b
是 False,所以你需要使用 b.flat
。 - JoshAdelb.flatten().base
没有返回值… (b.flat == b.flatten()).all()
为 True,那有什么区别? - Benjaminbroadcast_to
是自numpy 1.10版本开始提供的函数,它可以让你以更少的努力有效地重复一个数组。以下内容为接受答案的风格:import numpy as np
arr = np.arange(10)
repeated = np.broadcast_to(arr, (1000, arr.size))
我不完全确定你所说的“不要复制1000次数据”的意思。如果您正在寻找一种numpy方法,可以一次性地从a
构建b
(而不是循环),您可以使用以下方法:
a = np.arange(1000)
b = np.tile(a,1000)
a = np.arange(1000)
ii = [700,2000,10000] # The indices you want of the tiled array
b = a[np.mod(ii,a.size)]
b
不是a
的视图,但至少它返回一个numpy数组,并且不会在内存中创建1000x1000x1的数组,只包含您想要的元素。我并不声称这是最优雅的解决方案,因为你必须欺骗numpy创建一个对象数组(请参见带有注释的行)
from numpy import array
n = 3
a = array([1,2])
a.setflags(write=False)
t = [a]*n + [array([1])] # Append spurious array that is not len(a)
r = array(t,dtype=object)
r.setflags(write=False)
assert id(a) == id(t[1]) == id(r[1])
import numpy
a = numpy.array([1, 2, 3, 4])
b = numpy.ones((1000, a.shape[0]))
b *= a
b = b.flatten()