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

Moe*_*Moe 15 python arrays 2d numpy object

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

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

Single entry/object of obj_array:  ['NAME',[10.0,20.0,30.0],....] 
Run Code Online (Sandbox Code Playgroud)

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

obj_array[:,[1,2,3]]
Run Code Online (Sandbox Code Playgroud)

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

size [N,3] of N rows and 3 entries of X,Y,Z coordinates
Run Code Online (Sandbox Code Playgroud)

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

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

for row in range(obj_array.shape[0]):
    Centers[row,:] = obj_array[row,1]
Run Code Online (Sandbox Code Playgroud)

谢谢

Jai*_*ime 15

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

>>> 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)
Run Code Online (Sandbox Code Playgroud)

我的第一个猜测是:

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

但这样可以保持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.
Run Code Online (Sandbox Code Playgroud)

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

>>> 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
Run Code Online (Sandbox Code Playgroud)

不是在这里,这有点令人费解.显然,你的数组中的对象是抛出这个对象的列表,因为用元组替换列表有效:

>>> 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.]])
Run Code Online (Sandbox Code Playgroud)

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

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

虽然这不会很有效,但最好还是选择以下内容:

>>> 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.]])
Run Code Online (Sandbox Code Playgroud)


ali*_*i_m 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)
Run Code Online (Sandbox Code Playgroud)

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


小智 6

这对于数组 arr 从对象转换为浮点数数组非常有效。之后的数字处理非常容易。谢谢你最后的帖子!!!!我刚刚修改它以包含任何 DataFrame 大小:

float_arr = np.vstack(arr[:, :]).astype(np.float)
Run Code Online (Sandbox Code Playgroud)