numpy数组类型如何与对象进行交互?

时间:2017-10-17 21:47:22

标签: python arrays python-3.x numpy

我目前正在尝试实现一种在numpy数组中存储浮点数据的数据类型。然而,尝试为具有不同长度的此类元素分配数组似乎显然会破坏代码。可以将序列分配给数组元素,这是不可能的。

可以通过使用数据类型对象而不是float来绕过它。这是为什么?如何在不创建序列的情况下使用浮点数解决此问题?

不起作用的示例代码。

<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<input type="text" placeholder="Placeholder text" />​

可行的示例代码:

from numpy import *

foo= dtype(float32, [])
x = array([[2., 3.], [3.]], dtype=foo)

有效的示例代码,我尝试复制float:

from numpy import *

foo= dtype(float32, [])
x = array([[2., 3.], [3., 2.]], dtype=foo)

2 个答案:

答案 0 :(得分:0)

Numpy中的awk 'BEGIN { FS = ","} ; { "puppet node purge " $0 } ' < input.txt dtype只是创建了一个指向Python对象的指针数组。这意味着你失去了通常从Numpy获得的性能优势,但它有时仍然有用。

您的上一个示例创建了一个长度为2的一维Numpy数组,因此它是Python对象的两个指针。这两个对象恰好都是列表,Python列表具有任意动态长度。

答案 1 :(得分:0)

我不知道你想用这个来实现什么,但请注意

>>> np.dtype(np.float32, []) == np.float32
True

数组每行需要相同数量的元素。因此,如果您在numpy中提供列表列表,并且所有子列表都具有相同数量的元素,那么它将很乐意将其转换为数组。这就是你的第二个例子的原因。

如果子列表长度不同,则每个子列表都被视为单个对象,最终得到一维对象数组。这就是你的第三个例子有效的原因。您的第一个示例不起作用,因为您尝试将一系列对象强制转换为浮点数,这是不可能的。

简而言之,如果子列表的长度不同,则无法创建浮点数组。最好的情况是,你可以创建一个1D数组的数组,因为它们仍然被认为是对象。

>>> x = np.array(list(map(np.array, [[2., 3.], [3.]])))
>>> x
array([array([ 2.,  3.]), array([ 3.])], dtype=object)
>>> x[0]
array([ 2.,  3.])
>>> x[0][1]
3.0
>>> # but you can't do this
>>> x[0,1]
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    x[0,1]
IndexError: too many indices for array

如果您倾向于创建浮动2D数组,则必须使用None将所有子列表扩展为相同的尺寸,并将其转换为np.nan

>>> lists = [[2., 3.], [3.]]
>>> max_len = max(map(len, lists))
>>> for i, sublist in enumerate(lists):
    sublist = sublist + [None] * (max_len - len(sublist))
    lists[i] = sublist

>>> np.array(lists, dtype=np.float32)
array([[  2.,   3.],
       [  3.,  nan]], dtype=float32)