我有一個 numpy 整數陣列。在我的代碼中,我需要從串列中附加一些其他整數,這可以正常作業int64并按預期回傳一個 dtype 陣列。但可能會發生要附加的整數串列為空的情況。在這種情況下,numpy 回傳一個值陣列float64。下面的示例代碼:
import numpy as np
a = np.arange(10, dtype='int64')
np.append(a, [10]) # dtype is int64
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
np.append(a, []) # dtype is float64
# array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
這是預期的行為嗎?如果是這樣,這背后的理由是什么?這甚至可能是一個錯誤嗎?
的檔案np.append說明回傳值是
附加到
arr的副本。valuesaxis
由于沒有要附加的值,它不應該只回傳陣列的副本嗎?
(Numpy 版本:1.22.4,Python 版本:3.8.0)
uj5u.com熱心網友回復:
dtype從空串列構造的 numpy 陣列的默認值是float64:
>>> np.array([])
array([], dtype=float64)
dtype將float64“贏得” int64dtype 并將所有內容提升為float64,因為反過來轉換會導致精度損失(即截斷 any float64)。當然這是一個極端情況,因為在空陣列中沒有要截斷的值,但檢查只在dtype. 有關這方面的numpy.result_type()更多資訊,請參見.
實際上:
>>> a = np.array(dtype='int64')
>>> a
array([], dtype=int64)
>>> b = np.array([])
>>> b
array([], dtype=float64)
>>> np.result_type(a, b)
dtype('float64')
該np.promote_types()函式用于確定要提升到的型別:
>>> np.promote_types('int64', 'float64')
dtype('float64')
另請參閱:如何在內部計算 numpy 陣列的 dtype?
uj5u.com熱心網友回復:
您可以在追加時轉換陣列并指定所需的型別:
import numpy as np
a = np.arange(10, dtype="int64")
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64)
np.append(a, [])
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.], dtype=float64)
np.append(a, np.array([], dtype=a.dtype))
# array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64)
uj5u.com熱心網友回復:
在源代碼中numpy.append,我們可以看到它呼叫了numpy.concatenate. 查看此方法的檔案,我們看到它接受兩個與型別相關的引數:dtype和casting,其默認值為 None。由于numpy.append不提供其中任何一個的值,因此假定為默認值。的默認值casting是same-kind,它允許在一種型別中進行安全轉換,如此處所述。由于所有這些都是在 C 中完成的,我的猜測是concatenate試圖猜測您提供的陣列的型別。但是,由于它是空的,因此無法假定任何型別,因此它采用適合兩個輸入的最廣泛型別并將其分配給輸出。
如果你想避免這種情況,你可能應該使用 numpy 陣列而不是 Python 串列來追加:
np.append(a, np.array([], dtype = 'int64'))
uj5u.com熱心網友回復:
你能避免用某種 if 陳述句附加空串列嗎?
我認為它作為 [] 的預期行為仍然是一個附加的值。顯然 [] 不能是整數,因此它可能假定它是浮點數(默認轉換)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488967.html
標籤:Python 数组 python-3.x 麻木的
上一篇:numpy.sum有條件的
