2013-04-09 2 views
2

Я пытаюсь создать случайный массив из 0 и 1, и я получаю ошибку: несоответствие формы: объекты не могут быть переданы в одну форму. Ошибка, похоже, происходит в строке randints = np.random.binomial(1,p,(n,n)). Вот функция:Ошибка формы «несоответствие формы» с использованием numpy в python

import numpy as np 

def rand(n,p): 
    '''Generates a random array subject to parameters p and N.''' 

    # Create an array using a random binomial with one trial and specified 
    # parameters. 
    randints = np.random.binomial(1,p,(n,n)) 

    # Use nested while loops to go through each element of the array 
    # and assign True to 1 and False to 0. 
    i = 0 
    j = 0 
    rand = np.empty(shape = (n,n),dtype = bool) 
    while i < n: 
     while j < n: 
      if randints[i][j] == 0: 
       rand[i][j] = False 
      if randints[i][j] == 1: 
       rand[i][j] = True 
      j = j+1 
     i = i +1 
     j = 0 

    # Return the new array. 
    return rand 

print rand 

Когда я запускаю его сам по себе, он возвращает <function rand at 0x1d00170>. Что это значит? Как преобразовать его в массив, с которым можно работать в других функциях?

+0

Какие версии python и numpy вы используете? У вашего кода, опубликованного выше, есть некорректная информация в 'i = i + 1' ... – Jaime

+3

Причина, по которой он печатает' 'при запуске этой программы, потому что ваша строка' print rand' печатается объект функции. Вам нужно вызвать функцию. Попробуйте: 'print rand (4,2)' вместо этого. – Wilduck

ответ

4

Вам не нужно пройти через все это,

randints = np.random.binomial(1,p,(n,n)) 

производит ваш массив 0 и 1 значений,

rand_true_false = randints == 1 

будет производить еще один массив, как раз с 1 s заменяется True и 0 s с False.

+3

Другим способом преобразования в True/False является 'randints.astype (bool)' – askewchan

1

Очевидно, что ответ @danodonovan является самым Pythonic, но если вы действительно хотите что-то более похожее на ваш код цикла. Вот пример, который упрощает конфликты имен и циклы.

import numpy as np 

def my_rand(n,p): 
    '''Generates a random array subject to parameters p and N.''' 

    # Create an array using a random binomial with one trial and specified 
    # parameters. 

    randInts = np.random.binomial(1,p,(n,n)) 

    # Use nested while loops to go through each element of the array 
    # and assign True to 1 and False to 0. 

    randBool = np.empty(shape = (n,n),dtype = bool) 
    for i in range(n): 
     for j in range(n): 
      if randInts[i][j] == 0: 
       randBool[i][j] = False 
      else: 
       randBool[i][j] = True 

    return randBool 


newRand = my_rand(5,0.3) 
print(newRand) 
+1

Маленькая мета-заметка: «ответ выше» может не всегда быть правдой, поскольку добавляются другие ответы. Лучше ссылаться на ответ плакатом, т. Е. «Ответ от @danodonovan». Кроме того, похоже, что ваш оператор возврата должен быть отступом в функции. – Hooked

Смежные вопросы