29

作为我正在研究的更广泛程序的一部分,我最终得到了带有字符串、3D 坐标等的对象数组。我知道与结构化数组相比,对象数组可能不是很受欢迎,但我希望在不更改大量代码的情况下解决这个问题。

让我们假设我的数组 obj_array 的每一行(有 N 行)的格式为

Single entry/object of obj_array:  ['NAME',[10.0,20.0,30.0],....] 

现在,我正在尝试加载此对象数组并切片 3D 坐标块。到这里为止,一切都很好,只需询问让我们说 for 。

obj_array[:,[1,2,3]]

然而,结果也是一个对象数组,我会遇到问题,因为我想形成一个二维浮点数组:

size [N,3] of N rows and 3 entries of X,Y,Z coordinates

现在,我正在遍历行并将每一行分配给目标 2D 浮点数组的一行以解决该问题。我想知道 numpy 的数组转换工具是否有更好的方法?我尝试了几件事,但无法绕过它。

Centers   = np.zeros([N,3])

for row in range(obj_array.shape[0]):
    Centers[row,:] = obj_array[row,1]

谢谢

4

8 回答 8

29

讨厌的小问题......我一直在玩这个玩具示例:

>>> arr = np.array([['one', [1, 2, 3]],['two', [4, 5, 6]]], dtype=np.object)
>>> arr
array([['one', [1, 2, 3]],
       ['two', [4, 5, 6]]], dtype=object)

我的第一个猜测是:

>>> np.array(arr[:, 1])
array([[1, 2, 3], [4, 5, 6]], dtype=object)

但这保留了objectdtype,所以也许那时:

>>> np.array(arr[:, 1], dtype=np.float)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: setting an array element with a sequence.

您通常可以通过以下方式解决此问题:

>>> np.array(arr[:, 1], dtype=[('', np.float)]*3).view(np.float).reshape(-1, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected a readable buffer object

不过不在这里,这有点令人费解。显然,数组中的对象是列表,这会引发这种情况,因为用元组替换列表是可行的:

>>> np.array([tuple(j) for j in arr[:, 1]],
...          dtype=[('', np.float)]*3).view(np.float).reshape(-1, 3)
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

由于似乎没有任何完全令人满意的解决方案,最简单的可能是:

>>> np.array(list(arr[:, 1]), dtype=np.float)
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])

虽然这不会很有效,但可能更好地使用类似的东西:

>>> np.fromiter((tuple(j) for j in arr[:, 1]), dtype=[('', np.float)]*3,
...             count=len(arr)).view(np.float).reshape(-1, 3)
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]])
于 2013-10-18T21:38:12.387 回答
14

基于 Jaime 的玩具示例,我认为您可以非常简单地使用np.vstack()

arr = np.array([['one', [1, 2, 3]],['two', [4, 5, 6]]], dtype=np.object)
float_arr = np.vstack(arr[:, 1]).astype(np.float)

无论对象数组中的“数字”元素是一维 numpy 数组、列表还是元组,这都将起作用。

于 2013-10-19T22:37:07.760 回答
5

这对您的数组 arr 非常有用,可以将对象转换为浮点数组。号码处理后非常容易。谢谢你最后的帖子!!!!我刚刚修改它以包含任何 DataFrame 大小:

float_arr = np.vstack(arr[:, :]).astype(np.float)
于 2016-01-08T21:59:50.837 回答
2

将对象数组转换为 NumPy 浮点数组会更快: arr=np.array(arr, dtype=[('O', np.float)]).astype(np.float)- 从那里没有循环,就像您通常在 NumPy 数组上所做的那样对其进行索引。arr[:, 1]尽管使用不同的数据类型等,但您必须分块进行arr[:,2]。从 C++ DLL 函数返回的 NumPy 元组对象存在相同的问题 - 17M 元素的转换需要 <2s。

于 2016-03-13T20:49:35.373 回答
1

您可能想要使用结构化数组,这样当您需要独立访问名称和值时,您可以轻松地做到这一点。在此示例中,有两个数据点:

x = zeros(2, dtype=[('name','S10'), ('value','f4',(3,))])
x[0][0]='item1'
x[1][0]='item2'
y1=x['name']
y2=x['value']

结果:

>>> y1
array(['item1', 'item2'], 
      dtype='|S10')
>>> y2
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]], dtype=float32)

查看更多详细信息: http: //docs.scipy.org/doc/numpy/user/basics.rec.html

于 2013-10-18T21:39:10.787 回答
1

当您拥有不同类型的数据集时,通常会发生此问题,通常是第一列左右的日期。

我用来做的是将日期列存储在不同的变量中;并将“X 特征矩阵”的其余部分放入 X。例如,我有日期和 X。

然后我将转换应用于 X 矩阵:

X = np.array(list(X[:,:]), dtype=np.float)

希望有所帮助!

于 2017-09-20T09:07:56.313 回答
1

对于结构化数组使用

structured_to_unstructured(arr).astype(np.float)

请参阅:https ://numpy.org/doc/stable/user/basics.rec.html#numpy.lib.recfunctions.structured_to_unstructured

于 2021-05-13T13:32:50.440 回答
0

np.array(list(arr), dtype=np.float)可以一次将数组中的所有元素转换为浮点数。

于 2021-12-01T00:20:13.697 回答