我正在尝试制作numpy.array
其他numpy.array's
进行蒙特卡罗模拟。我想取一个数组的元素(另一个1d数组)并在其上执行一些函数,它返回该数组的一个子部分,然后重新赋值。 最初所有数组的长度都相同,这似乎会导致问题。
我想:例如
c1 = np.array([np.array(xi) for xi in [[1,2],[1],[1,3]]])
c1[2] = np.array([5])
工作得很好:
array([array([1, 2]), array([1]), array([5])], dtype=object)
当我进行变换时,我得到相同类型的结构,这使得所有子数组的长度相同。
c2 = np.array([np.array(xi) for xi in [[1,2],[1],[1,3]]])
c2[1] = np.array([4,5])
给
array([array([1, 2]), array([4, 5]), array([1, 3])], dtype=object).
取而代之的是:例如
当我开始所有数组的长度相同时,它们会从np.arrays
转换为lists
。
c3 = np.array([np.array(xi) for xi in [[1,2],[1,2],[1,4]]])
给出了
array([[1, 2], [1, 2], [1, 4]]).
现在,如果我尝试调整其中一个列表的长度
c3[1] = np.array([5])
我收到广播
array([[1, 2], [5, 5], [1, 4]])
而我想要
array([array([1, 2]), array([5]), array([1, 4])])
效果问题:
这完全适用于蒙特卡罗模拟,通常我希望处理一个大约10,000个子阵列的阵列,其中每个子阵列是一个大约1&#39,000个元素的数组(浮点数) )。我一直在使用numpy,因为它的随机数生成非常快,并且它对矢量化函数有很好的性能,特别是我想在这些函数上最终执行某种累积求和(np.cumsum
),还有一些其他更深奥的功能。我能够用列表做这种事情,但它花了大约20倍的时间,并且我希望尽可能地进行优化。
很多谢谢。
答案 0 :(得分:1)
numpy不允许你更改np.arrays的np.arrays的形状:
>>> c3 = np.array([np.array(xi) for xi in [[1,2],[1,2],[1,4]]])
>>> c4 = np.array([c3[:1],np.array([5]), c3[2:]])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (2) into shape (1)
您可以使用dtype=np.ndarry
np.empty
:
>>> ourList = [[1,2],[1,2],[1,4]]
>>> c3 = np.empty(len(ourList), dtype=np.ndarray)
>>> for i in xrange(len(ourList)):
>>> c3[i] = np.array(outList[i])
>>> c3
array([array([1, 2]), array([1, 2]), array([1, 4])], dtype=object)
>>> c3[1] = np.array([5])
>>> c3
array([array([1, 2]), array([5]), array([1, 4])], dtype=object)
这是你在找什么?
您可能只想设置一个零或一些巨大的负数/正数,这些数字不会影响您的模拟:
>>> c3 = np.array([np.array(xi) for xi in [[1,2],[1,2],[1,4]]])
>>> c3[1] = np.array([5])
>>> c3
array([[1, 2],
[5, 5],
[1, 4]])
>>> c3[1][1] = -9999999
>>> c3
array([[ 1, 2],
[ 5, -9999999],
[ 1, 4]])