Numpy - 将np.arrays自动隐式转换为列表

时间:2016-05-07 17:18:35

标签: python arrays list numpy implicit-conversion

我正在尝试制作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倍的时间,并且我希望尽可能地进行优化。

很多谢谢。

1 个答案:

答案 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]])