NumPy как изменить, когда некоторые данные отсутствуют? - PullRequest
0 голосов
/ 04 апреля 2020

Со следующими исходными данными -

In [53]: source_data = np.array([ 
    ...: [0, 0, 0, 10], 
    ...: [0, 0, 1, 11], 
    ...: [0, 1, 0, 12], 
    ...: [0, 1, 1, 13], 
    ...: [1, 0, 0, 14],  
    ...: [1, 0, 1, 15],  
    ...: [1, 1, 0, 16],  
    ...: [1, 1, 1, 17] 
    ...: ])

Я могу изменить форму, чтобы сделать индексацию более удобной -

In [62]: max = np.max(source_data, axis=0).astype(int)                                               

In [63]: max                                                                                         
Out[63]: array([ 1,  1,  1, 17])

In [64]: three_d = np.ravel(source_data[:,3]).reshape((max[0]+1, max[1]+1, max[2]+1))                

In [65]: three_d                                                                                     
Out[65]: 
array([[[10, 11],
        [12, 13]],

       [[14, 15],
        [16, 17]]])

, но в случае отсутствия строк в исходных данных, например -

In [68]: source_data2 = np.array([ 
    ...: [0, 0, 0, 10], 
    ...: [0, 0, 1, 11], 
    ...: [0, 1, 1, 13], 
    ...: [1, 1, 0, 16],  
    ...: [1, 1, 1, 17] 
    ...: ]) 

Какой самый эффективный способ преобразовать его в следующее?

array([[[10, 11],
        [nan, 13]],

       [[nan, nan],
        [16, 17]]])

1 Ответ

1 голос
/ 05 апреля 2020
In [512]: source_data = np.array([  
     ...:     ...: [0, 0, 0, 10],  
     ...:     ...: [0, 0, 1, 11],  
     ...:     ...: [0, 1, 0, 12],  
     ...:     ...: [0, 1, 1, 13],  
     ...:     ...: [1, 0, 0, 14],   
     ...:     ...: [1, 0, 1, 15],   
     ...:     ...: [1, 1, 0, 16],   
     ...:     ...: [1, 1, 1, 17]  
     ...:     ...: ])  

reshape работает, потому что source_data завершен и в порядке; вы игнорируете координаты в первых 3 столбцах.

Но мы можем использовать их с:

In [513]: arr = np.zeros((2,2,2), int)                                                         
In [514]: arr[source_data[:,0], source_data[:,1], source_data[:,2]] = source_data[:,3]         
In [515]: arr                                                                                  
Out[515]: 
array([[[10, 11],
        [12, 13]],

       [[14, 15],
        [16, 17]]])

Мы можем сделать то же самое со следующим источником:

In [516]: source_data2 = np.array([  
     ...:     ...: [0, 0, 0, 10],  
     ...:     ...: [0, 0, 1, 11],  
     ...:     ...: [0, 1, 1, 13],  
     ...:     ...: [1, 1, 0, 16],   
     ...:     ...: [1, 1, 1, 17]  
     ...:     ...: ])               

заполните цель nan:

In [517]: arr = np.full((2,2,2), np.nan)                                                       
In [518]: arr                                                                                  
Out[518]: 
array([[[nan, nan],
        [nan, nan]],

       [[nan, nan],
        [nan, nan]]])
In [519]: arr[source_data2[:,0], source_data2[:,1], source_data2[:,2]] = source_data2[:,3]     
In [520]: arr                                                                                  
Out[520]: 
array([[[10., 11.],
        [nan, 13.]],

       [[nan, nan],
        [16., 17.]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...