Уменьшить массив NumPy при сохранении распределения - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь написать функцию, которая может случайным образом сэмплировать numpy.ndarray с числами с плавающей запятой, сохраняя при этом распределение чисел в массиве. У меня есть эта функция сейчас:

import random
from collections import Counter

def sample(A, N):
    population = np.zeros(sum(A))
    counter = 0
    for i, x in enumerate(A):
            for j in range(x):
                    population[counter] = i
                    counter += 1

    sampling = population[np.random.choice(0, len(population), N)]
    return np.histogram(sampling, bins = np.arange(len(A)+1))[0]

Итак, я бы хотел, чтобы функция работала примерно так (без учета распределения для этого примера):

a = np.array([1.94, 5.68, 2.77, 7.39, 2.51])
new_a = sample(a,3)

new_a
array([1.94, 2.77, 7.39])

Однако, когда я применяю функцию к массиву, я получаю:

TypeError                                 Traceback (most recent call last)
<ipython-input-74-07e3aa976da4> in <module>
----> 1 sample(a, 3)

<ipython-input-63-2d69398e2a22> in sample(A, N)
      3 
      4 def sample(A, N):
----> 5     population = np.zeros(sum(A))
      6     counter = 0
      7     for i, x in enumerate(A):

TypeError: 'numpy.float64' object cannot be interpreted as an integer

Любая помощь по изменению или созданию функции, которая будет работать для этого, будет очень признательна!

1 Ответ

1 голос
/ 13 июня 2019
In [67]: a = np.array([1.94, 5.68, 2.77, 7.39, 2.51])                                                  
In [68]: np.zeros(sum(a))                                                                              
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-68-263779bc977b> in <module>
----> 1 np.zeros(sum(a))

TypeError: 'numpy.float64' object cannot be interpreted as an integer

сумма на форме не приводит к этой ошибке:

In [69]: np.zeros(sum(a.shape))                                                                        
Out[69]: array([0., 0., 0., 0., 0.])

Но вам не нужно использовать сумму:

In [70]: a.shape                                                                                       
Out[70]: (5,)
In [71]: np.zeros(a.shape)                                                                             
Out[71]: array([0., 0., 0., 0., 0.])

На самом деле, если a - это 2d, и вам нужен массив 1d с тем же числом элементов, вы хотите получить произведение формы, а не сумму.

Но вы хотите вернуть массив точно такого же размера, как A? Я думал, что вы пытаетесь сократить.

...