将numpy元素转换为numpy dtypes

时间:2016-07-12 15:01:40

标签: python numpy

有没有一种方便的方法将numpy数组的元素从任意和未知的本机python类型转换为等效的numpy类型?我可以检查每个元素的类型并单独转换每个类型,但我希望可能有一个更方便的方法。

我通过在旧数组中提取每个对象的属性来获取新数组中的python类型,如下所示:

import numpy as np
from operator import attrgetter

class myobj():
    def __init__(self, value):
        self.myattr = value

obj_array = np.empty((3,3), dtype='object')
for i in range(obj_array.shape[0]):
    for j in range(obj_array.shape[0]):
        obj_array[i,j] = myobj(i+j)

native_type_array = np.frompyfunc(attrgetter('myattr'), 1, 1)(obj_array)

按此question/answer.

3 个答案:

答案 0 :(得分:0)

您可以使用numpy例程astype()

>>> import numpy as np
>>> arr = np.array([1.2, 3.4, 5.6])
>>> arr = arr.astype(np.int)
>>> print(arr)
[1 2 3]

答案 1 :(得分:0)

值存储在myattr属性中,因此我认为您需要明确指定此属性。这应该工作

new_obj_array = np.frompyfunc(lambda x : np.int32(x.myattr), 1, 1)(obj_array)

答案 2 :(得分:0)

如果我在代码中添加__repr__方法和一些打印:

import numpy as np
from operator import attrgetter

class myobj():
    def __init__(self, value):
        self.myattr = value
    def __repr__(self):
        return self.myattr.__repr__()

obj_array = np.empty((3,3), dtype='object')
for i in range(obj_array.shape[0]):
    for j in range(obj_array.shape[0]):
        obj_array[i,j] = myobj(i+j)

native_type_array = np.frompyfunc(attrgetter('myattr'), 1, 1)(obj_array)
print(native_type_array.shape)
print(native_type_array.dtype)
print(native_type_array)
print(obj_array)

我得到了

1011:~/mypy$ python3 stack38332556.py 
(3, 3)
object
[[0 1 2]
 [1 2 3]
 [2 3 4]]
[[0 1 2]
 [1 2 3]
 [2 3 4]]

native_type_array也是一个对象dtype数组 - 这是frompyfunc的文档所说的内容。但由于元素是数字,因此显示效果很好。

通过给myobj类似的repr,我得到同样的东西。如果我改变了repr

def __repr__(self):
    return '<%s>'%self.myattr

我明白了:

[[<0> <1> <2>]
 [<1> <2> <3>]
 [<2> <3> <4>]]

这也适用于列表。 print([myobj(10),myobj(11)])生成[<10>, <11>]