Почему мой массив не инициализируется?Numpy - ошибка - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь инициализировать массив другим после внесения в него изменений.

Использование библиотечной функции Numpy на python, работающей с набором pydataset по умолчанию

import numpy as np
from pydataset import data
iris_data=data('iris')
iris_arr=iris_data.values 

sp_l = iris_arr[:,0] #sepal.length
sp_w = iris_arr[:,1] #sepal.width

sp_l = np.array(sp_l)
sp_w = np.array(sp_w) 

if(sp_l.any() <= 5 and sp_w.any() <= 3):
   sp_le = np.asarray(sp_l)
   sp_we = np.asarray(sp_w) 

NameError: имя 'sp_le' не определено

Я ожидал, что sp_le будет инициализирован

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Я могу загрузить набор данных iris из sklearn с помощью:

In [317]: from sklearn.datasets import load_iris  
In [321]: arr = load_iris().data                                                
In [322]: arr.shape                                                             
Out[322]: (150, 4)

Результат - массив 2d;первые 5 строк:

In [323]: arr[:5,:]                                                             
Out[323]: 
array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       [4.7, 3.2, 1.3, 0.2],
       [4.6, 3.1, 1.5, 0.2],
       [5. , 3.6, 1.4, 0.2]])

первый и второй столбцы:

In [324]: sp_l = arr[:,0]                                                       
In [325]: sp_w = arr[:,1]                                                       
In [326]: sp_l.shape                                                            
Out[326]: (150,)

sp_l.any() просто проверяет, не равны ли значения 0. Я не думаю, что вы этого хотите.

sp_l<=5 проверяет, являются ли значения sp_l меньшими или равными 5

In [327]: (sp_l<=5).any()                                                       
Out[327]: True                # at least some are
In [328]: (sp_l<=5).sum()                                                       
Out[328]: 32                  # there are 32 true values in that test
In [329]: (sp_w<=3).sum()                                                       
Out[329]: 83                  # and 83 sp_w values are small enough.

Неясно, что вы хотите, но одна возможность состоит в том, что вы хотите строки, где sp_l равно 5 или меньше, а sp_w равно 3 или меньше.

In [330]: (sp_l<=5)&(sp_w<=3)           # the () and & are important                                        
Out[330]: 
array([False,  True, False, False, False, False, False, False,  True,
       False, ... False])
In [331]: ((sp_l<=5)&(sp_w<=3)).sum()                                           
Out[331]: 12

Мы получаем индексы этих строк с where:

In [332]: idx =  np.where(((sp_l<=5)&(sp_w<=3)))                                
In [333]: idx                                                                   
Out[333]: (array([  1,   8,  12,  13,  25,  38,  41,  45,  57,  60,  93, 106]),)

и фактические строки:

In [334]: arr[idx[0]]                                                           
Out[334]: 
array([[4.9, 3. , 1.4, 0.2],
       [4.4, 2.9, 1.4, 0.2],
       [4.8, 3. , 1.4, 0.1],
       [4.3, 3. , 1.1, 0.1],
       [5. , 3. , 1.6, 0.2],
       [4.4, 3. , 1.3, 0.2],
       [4.5, 2.3, 1.3, 0.3],
       [4.8, 3. , 1.4, 0.3],
       [4.9, 2.4, 3.3, 1. ],
       [5. , 2. , 3.5, 1. ],
       [5. , 2.3, 3.3, 1. ],
       [4.9, 2.5, 4.5, 1.7]])
0 голосов
/ 11 апреля 2019

Я думаю, что единственная проблема - выражение условия. Данные, которые вы используете, могут не соответствовать условию. Поэтому, когда вы используете sp_le ниже, он не инициализируется. Если бы вы могли выдать значения sp_l и sp_w и проверить, хорошо ли это. А также то, что написал hpaulj, если вы хотите сказать, имеет ли sp_l элементы меньше 5, лучше использовать (sp_l <= 5). любой () </p>

...