2015-01-23 3 views
2

У меня относительно большой массив, например. 200 x 1000. Матрица является разреженной матрицей, где элементы можно считать весами. Весы варьируются от 0 до 500. Я хотел бы создать новый массив того же размера, 200x1000, где N элементов нового массива представляют собой случайные целые числа {0,1}. Вероятность того, что элемент в новой матрице равен 0 или 1, пропорционален весам из исходного массива, - чем выше вес, тем выше вероятность 1 против 0.Как произвольно пробовать матрицу в python?

Указывается другой способ: я хотел бы создать нулевую матрицу размером 200x1000, а затем случайным образом выберите N элементов для перевода в 1 на основе матрицы весов размером 200x1000.

ответ

2

брошу предлагаемый мое решение здесь, а также:

# for example 
a = np.random.random_integers(0, 500, size=(200,1000)) 
N = 200 

result = np.zeros((200,1000)) 
ia = np.arange(result.size) 
tw = float(np.sum(a.ravel())) 
result.ravel()[np.random.choice(ia, p=a.ravel()/tw, 
           size=N, replace=False)]=1 

где a является массив весов: то есть, выбрать индексы для детали, чтобы изменить 1 из массива ia, взвешенная по a.

0

Что-то, как это должно работать, нет никаких оснований, чтобы получить слишком сложны:

>>> import random 
>>> weights = [[1,5],[500,0]] 
>>> output = [] 
>>> for row in weights: 
...  outRow = [] 
...  for entry in row: 
...   outRow.append(random.choice([0]+[1 for _ in range(entry)])) 
...  output.append(outRow) 
... 
>>> output 
[[1, 1], [1, 0]] 

Это выбирает случайную запись из последовательности, которая всегда имеет один нуль, а затем n1 сек, где n является соответствующей записью в ваша весовая матрица. В этом варианте осуществления, масса 1 фактически 50/50 шанс либо 1 или 0. Если вы хотите 50/50 шанс произойти при 250 использовании outRow.append(random.choice([0 for _ in range(500-entry)] + [1 for _ in range(entry)]))

+0

Это, по-видимому, относится к весам по строкам и не равномерно по всей весовой матрице. Или я чего-то не хватает? – Aengus

+0

Нет, вот как это работает, разве это не так? – wnnmaw

1

Это может быть сделано с NumPy с

# Compute probabilities as a 1-D array 
probs = numpy.float64(weights).ravel() 
probs /= numpy.sum(probs) 

# Pick winner indexes 
winners = numpy.random.choice(len(probs), N, False, probs) 

# Build result 
result = numpy.zeros(weights.shape, numpy.uint8) 
result.ravel()[winners] = 1 
+0

это значительно проще, чем мое воодушевление - я бы не подумал об использовании numpy.uint8. Однако число значений «1» должно быть ровно N. – Aengus

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