Saya memiliki array numpy 2D. Beberapa nilai dalam array ini adalah NaN
. Saya ingin melakukan operasi tertentu menggunakan larik ini. Misalnya perhatikan array:
[[ 0. 43. 67. 0. 38.]
[ 100. 86. 96. 100. 94.]
[ 76. 79. 83. 89. 56.]
[ 88. NaN 67. 89. 81.]
[ 94. 79. 67. 89. 69.]
[ 88. 79. 58. 72. 63.]
[ 76. 79. 71. 67. 56.]
[ 71. 71. NaN 56. 100.]]
Saya mencoba untuk mengambil setiap baris, satu per satu, mengurutkannya dalam urutan terbalik untuk mendapatkan nilai maksimal 3 dari baris dan mengambil rata-ratanya. Kode yang saya coba adalah:
# nparr is a 2D numpy array
for entry in nparr:
sortedentry = sorted(entry, reverse=True)
highest_3_values = sortedentry[:3]
avg_highest_3 = float(sum(highest_3_values)) / 3
Ini tidak berfungsi untuk baris yang berisi NaN
. Pertanyaan saya adalah, apakah ada cara cepat untuk mengubah semua NaN
nilai menjadi nol dalam larik numpy 2D sehingga saya tidak memiliki masalah dengan pengurutan dan hal lain yang saya coba lakukan.
each: map: return isNaN(value) ? 0 : value
Jawaban:
Ini harus bekerja:
from numpy import * a = array([[1, 2, 3], [0, 3, NaN]]) where_are_NaNs = isnan(a) a[where_are_NaNs] = 0
Dalam kasus di atas di mana_are_NaNs adalah:
In [12]: where_are_NaNs Out[12]: array([[False, False, False], [False, False, True]], dtype=bool)
sumber
Di mana
A
array 2D Anda:import numpy as np A[np.isnan(A)] = 0
Fungsi tersebut
isnan
menghasilkan array bool yang menunjukkan di manaNaN
nilai-nilainya berada. Array boolean dapat digunakan untuk mengindeks larik dengan bentuk yang sama. Anggap saja seperti topeng.sumber
Bagaimana dengan nan_to_num () ?
sumber
Anda dapat menggunakan
np.where
untuk menemukan di mana Anda memilikiNaN
:import numpy as np a = np.array([[ 0, 43, 67, 0, 38], [ 100, 86, 96, 100, 94], [ 76, 79, 83, 89, 56], [ 88, np.nan, 67, 89, 81], [ 94, 79, 67, 89, 69], [ 88, 79, 58, 72, 63], [ 76, 79, 71, 67, 56], [ 71, 71, np.nan, 56, 100]]) b = np.where(np.isnan(a), 0, a) In [20]: b Out[20]: array([[ 0., 43., 67., 0., 38.], [ 100., 86., 96., 100., 94.], [ 76., 79., 83., 89., 56.], [ 88., 0., 67., 89., 81.], [ 94., 79., 67., 89., 69.], [ 88., 79., 58., 72., 63.], [ 76., 79., 71., 67., 56.], [ 71., 71., 0., 56., 100.]])
sumber
np.where(np.isnan(a), a, 0)
kenp.where(~np.isnan(a), a, 0)
. Ini mungkin perbedaan dalam versi yang digunakan.b = np.where(np.isnan(a), 0, a)
yang lebih mudah daripada yang~
saya pikirkan.Contoh kode jawaban drake untuk digunakan
nan_to_num
:>>> import numpy as np >>> A = np.array([[1, 2, 3], [0, 3, np.NaN]]) >>> A = np.nan_to_num(A) >>> A array([[ 1., 2., 3.], [ 0., 3., 0.]])
sumber
Anda dapat menggunakan numpy.nan_to_num :
Contoh (lihat dokumen):
>>> np.set_printoptions(precision=8) >>> x = np.array([np.inf, -np.inf, np.nan, -128, 128]) >>> np.nan_to_num(x) array([ 1.79769313e+308, -1.79769313e+308, 0.00000000e+000, -1.28000000e+002, 1.28000000e+002])
sumber
nan tidak pernah sama dengan nan
if z!=z:z=0
jadi untuk array 2D
for entry in nparr: if entry!=entry:entry=0
sumber
entry
adalah larik 1D, jadi pengujianentry != entry
tidak memberikan boolean sederhana tetapi memunculkanValueError
.Anda dapat menggunakan fungsi lambda, contoh untuk array 1D:
import numpy as np a = [np.nan, 2, 3] map(lambda v:0 if np.isnan(v) == True else v, a)
Ini akan memberi Anda hasil:
[0, 2, 3]
sumber
Untuk tujuan Anda, jika semua item disimpan sebagai
str
dan Anda hanya menggunakan disortir seperti yang Anda gunakan lalu periksa elemen pertama dan ganti dengan '0'>>> l1 = ['88','NaN','67','89','81'] >>> n = sorted(l1,reverse=True) ['NaN', '89', '88', '81', '67'] >>> import math >>> if math.isnan(float(n[0])): ... n[0] = '0' ... >>> n ['0', '89', '88', '81', '67']
sumber