np.reshape () заполнен NaN - PullRequest
       0

np.reshape () заполнен NaN

3 голосов
/ 19 июня 2020

Можно ли изменить форму np.array () и, в случае несоответствия новой формы, заполнить пустые пространства NaN?

Пример:

arr = np.array([1,2,3,4,5,6])

Target , например, матрица 2x4:

[1 2  3   4]
[5 6 NaN NaN]

Мне это нужно, чтобы обойти ошибку: ValueError: cannot reshape array of size 6 into shape (2,4)

Спасибо,

Ответы [ 3 ]

4 голосов
/ 19 июня 2020

Сначала мы будем использовать np.pad, а затем изменить форму:

m, n = 2, 4
np.pad(arr.astype(float), (0, m*n - arr.size), 
       mode='constant', constant_values=np.nan).reshape(m,n)


array([[ 1.,  2.,  3.,  4.],
       [ 5.,  6., nan, nan]])

Предполагается, что arr - это одномерный массив. Добавьте утверждение перед этим кодом для сбоя в непредвиденных случаях.

2 голосов
/ 19 июня 2020

Много способов сделать это, но (почти) все сводятся к созданию нового массива желаемой формы и значений заполнения:

In [50]: arr = np.array([1,2,3,4,5,6])                                          
In [51]: res = np.full((2,4), np.nan)                                           
In [52]: res                                                                    
Out[52]: 
array([[nan, nan, nan, nan],
       [nan, nan, nan, nan]])
In [53]: res.flat[:len(arr)]=arr                                                
In [54]: res                                                                    
Out[54]: 
array([[ 1.,  2.,  3.,  4.],
       [ 5.,  6., nan, nan]])

Я использовал flat для обработки res как 1d массив для копирования.

Исключение составляет метод resize, но он заполняется нулями. И не меняет dtype, чтобы разрешить float nan:

In [55]: arr.resize(2,4)                                                        
In [56]: arr                                                                    
Out[56]: 
array([[1, 2, 3, 4],
       [5, 6, 0, 0]])
1 голос
/ 19 июня 2020

Одно из возможных решений:

преобразовать массив в float (nan - тип с плавающей запятой)

arr = np.array([1,2,3,4,5,6]).astype(float)

изменить размер данных до новой формы

arr = np.resize(arr, (2,4))

print(arr)

array([[1., 2., 3., 4.],
   [5., 6., 1., 2.]])

заменить последние две записи с np.NaN

arr[-1,-2:] = np.NaN

print(arr)

array([[ 1.,  2.,  3.,  4.],
       [ 5.,  6., nan, nan]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...