有没有一种方便的方法将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)
答案 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>]