Numpy: ОШИБКА: обнаружение размеров не удается при смешивании скаляров и массивов shape == (1,)

Созданный на 9 дек. 2019  ·  5Комментарии  ·  Источник: numpy/numpy

np.array([0.25, np.array([0.3])]) не сможет создать массив с плавающей запятой, dtype будет object.

Мне это кажется неправильным, это намеренно?

00 - Bug numpy.dtype

Все 5 Комментарий

Копия @nschloe , кто против этого типа вещей и может ссылаться на их проблему

Спасибо за CCing. Да, это действительно похоже на то, о чем я уже говорил. : smiley_cat: https://github.com/numpy/numpy/issues/10404

Я бы сказал, что здесь правильно создать массив объектов. В конце концов, вы объединяете поплавок и массив. Если вы создали список Python,

[0.25, np.array([0.3])]

вы ожидаете того же: первая запись - это число с плавающей запятой, вторая - массив длины 1. Было бы странно, если бы списки и np.arrays здесь вели себя по-разному.

Кроме того, неявное создание здесь массива с плавающей запятой dtype сделало бы невозможным создание массива [float, vector[1]] даже если бы я захотел.

В большинстве случаев указание np.array([0.25, np.array([0.3])]) выполняется по ошибке, и это легко исправить; см., например, https://github.com/scipy/scipy/pull/11147/files#diff -21a6a0b0d89357857304bfba2da5a971L321. После всего,

Явное лучше, чем неявное.

ОК, закрытие. Этот пиар сделал бы недавние изменения НЭП 34 (после отмены) менее разрушительными и неубедительными.

@nschloe

неявное создание здесь массива dtype с плавающей запятой сделало бы невозможным создание массива [float, vector [1]], даже если бы я захотел.

Для записи вы можете сделать np.array(0.3, np.array([0.3]), dtype=object) .

Если вы создали список Python ...

NumPy ndarrays сильно отличается от списков Python. Я бы не ожидал, что
np.array([0.2, 0.3, 0.4]) создаст массив объектов, хотя я не указал np.float64 для dtype. Итак, мы согласны с тем, что нас устраивает некоторый уровень автоматического обнаружения dtype на основе значений. Вопрос в том, что должно иметь приоритет: числовые типы или типы объектов.

Итак, мы согласны с тем, что нас устраивает некоторый уровень автоматического обнаружения dtype на основе значений.

«Автоматизация» здесь, я думаю, довольно ясна: всегда получайте «самый низкий» тип данных, который может захватывать все входные значения:

numpy.array([1, 2]).dtype   # int64
numpy.array([1, numpy.array(2)]).dtype  # int64, array of rank 0 are basically scalars
numpy.array([1.0, 2]).dtype   # float64
numpy.array([1, [2]]).dtype   # O
Была ли эта страница полезной?
0 / 5 - 0 рейтинги