Я проверил вопросы/ответы, приведенные в следующих ссылках, и не нашел ничего, что могло бы мне помочь: 1) как читать массив чисел из текста файл на питоне 2) TypeError: итерация по массиву 0-d Python 3) Как индексировать массив 0-d в Python?

Этот пост самый близкий: Почему python считает, что мой массив равен 0-d? (TypeError: итерация по массиву 0-d)

Итак, я собираюсь написать свой вопрос здесь, а не открывать новый тег. Я надеюсь, что все в порядке, я здесь новичок, так что извините меня, если это не так.

Мое дело:

Я сделал функцию randomSampling (для упражнения в классе), например:

def randomSamples(array):
    print(array)
    print(type(array))
    i = 0

    while i < len(array):
        sampling1 = np.random.choice((array), 5)
        i += 1
        sampling1 = np.concatenate([sampling1])
        print(sampling1)

print(type(sampling1))

Затем я запускаю функцию следующим образом:

test1 = np.random.choice(15, 13)
sampling2 = randomSamples(test1)
sampling3 = np.asarray(sampling2)
print(type(sampling3))
sampling3.shape  # Nothing comes out, something may be wrong.

Результат:

[ 7  9  6  3 13  7  1  1  9  9  0  6 12]
<class 'numpy.ndarray'>
[6 9 7 9 9]
[12  1  1 13 12]
[ 9  7 13  0  1]
[3 1 9 3 1]
[ 1  1  7  6 13]
[ 6  9  7 12  0]
[ 9 12  3  3  6]
[3 9 6 3 3]
[ 1  9  9  6 13]
[6 1 1 3 3]
[1 9 9 3 1]
[13  9 13  9  9]
[ 7  1  6  0 12]
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>

Когда я бегу:

SEM(sampling3)

Я получил:

<class 'numpy.ndarray'>
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-556-1456ec9b184d> in <module>
----> 1 SEM(sampling3)

<ipython-input-269-90a8bbeb1e1a> in SEM(array)
      4     array1 = []
      5 
----> 6     for i in array:
      7         counter += i
      8         a1 = float(counter/len(array))

TypeError: iteration over a 0-d array

Я не понимаю, почему результат функции, хотя это класс numpy.ndarray, и я даже создал другую переменную (sampling3) с np.asarray, чтобы убедиться, что это np.array.

Я замечаю, что атрибут формы выходит пустым. В идеале массив должен быть: name = [[6 9 7 9 9],[12 1 1 13 12],...,[7 1 6 0 12]], с формой (13,5).

Любая помощь будет оценена. Заранее спасибо.

0
cdiaza 5 Апр 2020 в 01:43
sampling3.shape # Nothing comes out, something may be wrong. - что не так в этой конкретной строке, так это то, что вы забыли print.
 – 
user2357112
5 Апр 2020 в 01:45
1
Кроме того, вы ничего не return забыли, и вы выбрасываете результаты предыдущей итерации на каждой новой итерации.
 – 
user2357112
5 Апр 2020 в 01:47
Спасибо, пользователь 2357112 поддерживает Монику. Вы заставили меня понять, что у меня было неправильное представление о возврате по сравнению с печатью. Я думал, что, присваивая значение out of print переменной, я делаю больше, чем просто возвращаю его, видя и сохраняя его. Я ценю, что вы указали на проблему.
 – 
cdiaza
5 Апр 2020 в 19:29

1 ответ

Давайте рассмотрим действие вашей функции:

Сделайте первоначальный образец:

In [22]: arr = np.random.choice(15,13)                                                         
In [23]: arr                                                                                   
Out[23]: array([ 1,  3,  0, 14, 13, 13, 10,  9,  5,  0, 12, 12,  2])

Внутри цикла сделайте выборку из этого:

In [25]: samp = np.random.choice((arr), 5)                                                     
In [26]: samp                                                                                  
Out[26]: array([14,  5,  5,  3,  3])

concatenate ничего не делает. Что он должен был делать?

In [27]: samp = np.concatenate([samp])                                                         
In [28]: samp                                                                                  
Out[28]: array([14,  5,  5,  3,  3])

Возьмите еще один образец (() arr ничего не делает):

In [29]: samp = np.random.choice(arr, 5)                                                       
In [30]: samp                                                                                  
Out[30]: array([13,  3,  9,  9, 12])
In [31]: samp = np.concatenate([samp])                                                         
In [32]: samp                                                                                  
Out[32]: array([13,  3,  9,  9, 12])

samp от Out[28] потерян. Если вы хотите сохранить значения в цикле, вам нужно собрать их в структуру, например в список.

alist = []
for i in range(3):
   alist.append(np.random.choice(arr, 5)

Создает список из 3 массивов.

В вашей функции нет оператора return, поэтому она возвращает None:

In [33]: np.asarray(None)                                                                      
Out[33]: array(None, dtype=object)
In [34]: _.shape                                                                               
Out[34]: ()

Создание массива из None дает массив 0d.

In [36]: for i in np.asarray(None): pass                                                       
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-36-8942a42b4c6b> in <module>
----> 1 for i in np.asarray(None): pass

TypeError: iteration over a 0-d array
0
hpaulj 5 Апр 2020 в 06:52
Спасибо @hpaulj за очень четкое объяснение. Я понял проблемы в моем коде.
 – 
cdiaza
5 Апр 2020 в 19:40