Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将具有object dtype的Numpy二维数组转换为常规二维浮点数组_Python_Arrays_Object_Numpy_2d - Fatal编程技术网

Python 如何将具有object dtype的Numpy二维数组转换为常规二维浮点数组

Python 如何将具有object dtype的Numpy二维数组转换为常规二维浮点数组,python,arrays,object,numpy,2d,Python,Arrays,Object,Numpy,2d,作为我正在进行的更广泛程序的一部分,我最终得到了字符串、三维坐标等混合的对象数组。我知道,与结构化数组相比,对象数组可能不是很受欢迎,但我希望在不改变大量代码的情况下解决这个问题 假设我的数组obj_数组(有N行)的每一行都有 Single entry/object of obj_array: ['NAME',[10.0,20.0,30.0],....] 现在,我尝试加载这个对象数组并切片3D坐标块。到目前为止,只要简单地问一下,一切都很顺利 obj_array[:,[1,2,3]] 然

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

假设我的数组obj_数组(有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]

谢谢你这讨厌的小问题。。。我一直在玩弄这个玩具的例子:

>>> 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)
但这会保留
对象
数据类型,因此:

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

您可能希望使用结构化数组,以便在需要独立访问名称和值时可以轻松地进行访问。在本例中,有两个数据点:

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)

查看更多详细信息:

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


无论对象数组中的“数值”元素是1D numpy数组、列表还是元组,这都会起作用。

这在数组arr上非常有效,可以将对象转换为浮点数组。之后,数字处理非常容易。谢谢你最后的帖子!!!!我刚刚修改了它以包含任何数据帧大小:

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

这是将对象数组转换为NumPy float数组的更快方法:
arr=np.array(arr,dtype=[('O',np.float)]).astype(np.float)
-从那里没有循环,索引它就像通常在NumPy数组上做的那样。你必须做它的块,虽然你的不同的数据类型<代码> ARR [,1 ] < /COD>,<代码> ARR[(2)] /代码>等与一个从C++ DLL函数返回的NUMPY元组对象有相同的问题。对于17m元素的转换,需要使用< P>这个问题通常发生在你有不同类型的数据集时,通常,日期在第一列左右

我使用的方法是将日期列存储在不同的变量中;把剩下的“X特征矩阵”转化为X,比如,我有日期和X

然后我将转换应用于X矩阵,如下所示:

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


希望对大家有所帮助

对于结构化数组,请使用

结构化到非结构化(arr).astype(np.float)

请参阅:

您能展示一个简单的示例代码吗?原始数据是什么样的,转换代码是什么样的?这将使别人更容易给你提供适当的建议。这与其说是回答,不如说是评论。这与ali_m的答案有关吗?如果有人真的尝试了上面的解决方案并对其进行了分析,它将不会被否决。我得到“ValueError:使用序列设置数组元素”。这种方法会出错。。示例:aa=['5236',[1,2,0.3],['63734',[6,1.5,0.0]]bb=np.array(aa,dtype='object')arr=np.array(bb[:,1],dtype=[('O',np.float)]。astype(np float)
>>> y1
array(['item1', 'item2'], 
      dtype='|S10')
>>> y2
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]], dtype=float32)
arr = np.array([['one', [1, 2, 3]],['two', [4, 5, 6]]], dtype=np.object)
float_arr = np.vstack(arr[:, 1]).astype(np.float)
float_arr = np.vstack(arr[:, :]).astype(np.float)