我目前正在尝试实现一种在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)
答案 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)