np.array([0.25, np.array([0.3])])
не сможет создать массив с плавающей запятой, dtype будет object.
Мне это кажется неправильным, это намеренно?
Копия @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