Я хочу создать массив с dtype=np.object
, где каждый элемент является массивом с числовым типом, например, интервалом или плаванием. Например:
>>> a = np.array([1,2,3])
>>> b = np.empty(3,dtype=np.object)
>>> b[0] = a
>>> b[1] = a
>>> b[2] = a
Создает то, что я хочу:
>>> print b.dtype
object
>>> print b.shape
(3,)
>>> print b[0].dtype
int64
но я задаюсь вопросом, нет ли способа записать строки 3 - 6 в одной строке (тем более, что я мог бы хотеть связать 100 массивов). Я попробовал
>>> b = np.array([a,a,a],dtype=np.object)
но это на самом деле преобразовывает все элементы в np.object:
>>> print b.dtype
object
>>> print b.shape
(3,)
>>> print b[0].dtype
object
У кого-либо есть какие-либо идеи, как избежать этого?
Это не совсем красиво, но ...
import numpy as np
a = np.array([1,2,3])
b = np.array([None, a, a, a])[1:]
print b.dtype, b[0].dtype, b[1].dtype
# object int32 int32
Я не могу найти никакого элегантного решения, но, по крайней мере, более общее решение, позволяющее делать все вручную, - объявить функцию вида:
def object_array(*args):
array = np.empty(len(args), dtype=np.object)
for i in range(len(args)):
array[i] = args[i]
return array
Затем я могу сделать:
a = np.array([1,2,3])
b = object_array(a,a,a)
Тогда я получаю:
>>> a = np.array([1,2,3])
>>> b = object_array(a,a,a)
>>> print b.dtype
object
>>> print b.shape
(3,)
>>> print b[0].dtype
int64
Я думаю, что здесь вам нужен anyarray:
b = np.asanyarray([a,a,a])
>>> b[0].dtype
dtype('int32')
не уверен, что случилось с другими 32-мя битами целых чисел.
Не уверен, поможет ли это, но если вы добавите еще один массив другой формы, он преобразуется обратно в нужные вам типы:
import numpy as np
a = np.array([1,2,3])
b = np.array([1,2,3,4])
b = np.asarray([a,b,a], dtype=np.object)
print(b.dtype)
>>> object
print(b[0].dtype)
>>> int32