如何将具有对象dtype的Numpy 2D数组转换为常规的浮点数2D数组

时间:2013-10-18 21:04:01

标签: python arrays object numpy 2d

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

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

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

现在,我正在尝试加载此对象数组并切片3D坐标块。到目前为止,一切正常,只需要问一下。

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

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

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

现在,我循环遍历行并将每一行分配给目标2D flot数组的一行以解决问题。我想知道numpy的阵列转换工具是否有更好的方法?我尝试了一些东西,无法绕过它。

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

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

由于

7 个答案:

答案 0 :(得分:12)

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

>>> 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)

但是这会保留object dtype,所以可能会这样:

>>> 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.]])

答案 1 :(得分:6)

基于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)

无论对象数组中的“数字”元素是否为1D numpy数组,列表或元组,这都将起作用。

答案 2 :(得分: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

答案 3 :(得分:1)

这可以很好地处理你的数组arr,从一个对象转换为一个浮点数组。数字处理之后非常容易。谢谢你的最后一篇文章!!!!我刚修改它以包含任何DataFrame大小:

float_arr = np.vstack(arr[:, :]).astype(np.float)

答案 4 :(得分:1)

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

我用来做的是将日期列存储在另一个变量中;并采用其余的&#34; X矩阵特征&#34;到X.所以我有日期和X,例如。

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

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

希望能帮到你!

答案 5 :(得分:1)

对于结构化数组使用

structured_to_unstructured(arr).astype(np.float)

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

答案 6 :(得分:0)

将对象数组转换为NumPy浮点数组的速度更快: arr[:, 1] - 从那里没有循环,索引它就像你通常在NumPy数组上做的那样。您必须使用不同的数据类型arr[:,2]integrate等以块的形式执行此操作。对于从C ++ DLL函数返回的NumPy元组对象存在同样的问题 - 转换为17M元素需要&lt; 2s。

相关问题