Привет, у меня есть простая проблема. но я не понимаю, в чем причина проблемы.
У меня есть следующий сценарий python (3). У меня есть numpy 1.13.1 (старый, но моя проблема с dtype
должна работать). в соответствии с этим dtype существует в ufunc
с 1,6
import numpy as np
M=1001
N = 2 ** np.ceil(np.log2(M))
N
Out[252]: 1024.0
2 ** np.ceil(np.log2(M),dtype=int)
Traceback (most recent call last):
File "<ipython-input-253-4b982a04c884>", line 1, in <module>
2 ** np.ceil(np.log2(M),dtype=int)
TypeError: No loop matching the specified signature and casting
was found for ufunc ceil
2 ** np.ceil(np.log2(M),dtype=float)
Out[254]: 1024.0
2 ** np.ceil(np.log2(M),dtype=np.float64)
Out[256]: 1024.0
2 ** np.ceil(np.log2(M),dtype=np.float32)
Out[257]: 1024.0
2 ** np.ceil(np.log2(M),dtype=np.int64)
Traceback (most recent call last):
File "<ipython-input-258-9902fa43f3ac>", line 1, in <module>
2 ** np.ceil(np.log2(M),dtype=np.int64)
TypeError: No loop matching the specified signature and casting
was found for ufunc ceil
2 ** np.ceil(np.log2(M),dtype=np.int32)
Traceback (most recent call last):
File "<ipython-input-259-8a2f2834384f>", line 1, in <module>
2 ** np.ceil(np.log2(M),dtype=np.int32)
TypeError: No loop matching the specified signature and casting
was found for ufunc ceil
Как вы можете видеть, когда я изменяю dtype
на int
, int32
или int64
он терпит неудачу. Вероятно, что-то другое, кроме float
терпит неудачу. Я бы предположил, что этого не должно делать! Я могу добавить небольшое исправление, так что int(np.ceil(...))
результат - это то, что я хочу.
Я хочу знать, в чем причина этой проблемы? Так как я ничего не читал в справочном руководстве по numpy о какой-либо проблеме с этим (numpy reference ceil).
Если возможно решить эту проблему, чтобы она работала так, как я начал
Спасибо
Причина, по которой это происходит, просто связана с тем, как dtype
обрабатывается numpy ufuncs. Он не только отменяет выходной тип, но и тип вычисления. ceil
ufunc не поддерживает расчеты с участием целых чисел, так что он не:
Из документов для ufunc kwargs
:
dtype
Переопределяет тип вычислений и выходных массивов. Подобно подписи.
ceil
, нет смысла делать это дляint
. Когда вы указываетеdtype
, вы не просто указываете тип возвращаемого значения, но и dtype, с которым также выполняется вычисление. Не стесняйтесь изменить результат на целое число после выполнения расчета, но ожидается то, что вы видите в данный момент. Немного лучше обсуждения здесь