N мерный массив в python



Новое в Python и Numpy, пытающихся создать 263-мерные массивы.
Мне нужно так много измерений для модели машинного обучения.
Конечно, один из способов-это использование numpy.нули или numpy.единицы и написание кода, как показано ниже:



x=np.zeros((1,1,1,1,1,1,1,1,1,1,1))   #and more 1,1,1,1


Существует ли более простой способ создания массивов со многими измерениями?

553   3  

3 ответов:

Вам не нужны 263-измерения . Если бы каждое измерение имело только размер 2, у вас все еще были бы элементы 2 ** 263, которые являются: 14821387422376473014217086081112052205218558037201992197050570753012880593911808

Вы ничего не сможете сделать с такой матрицей : даже не инициализируете на серверах Google.

Вам либо понадобится массив с 263 значениями:

>>> np.zeros(263)
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.])

Или матрица с 263 векторами M элементов (скажем, 3):

>>> np.zeros((263, 3))
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       ...
       ...
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

Есть много продвинутых научно-исследовательские центры, что совершенно счастливы с ванилином и NumPy. Необходимость использовать менее 32 измерений, похоже, не сильно беспокоит их для квантовой механики или машинного обучения.

Начнем с документации numpy, help(np.zeros) дает

zeros(shape, dtype=float, order='C')

Return a new array of given shape and type, filled with zeros.

Parameters
----------
shape : int or sequence of ints
    Shape of the new array, e.g., ``(2, 3)`` or ``2``.
...
Returns
-------
out : ndarray
    Array of zeros with the given shape, dtype, and order.
...
Аргумент shape - это просто список размеров каждого измерения (но вы, вероятно, знали об этом). Есть много способов легко создать такой список в python, один быстрый способ -
 np.zeros(np.ones(263, dtype=int))
Но, как упоминали другие, numpy имеет несколько произвольное ограничение в 32 измерения. По моему опыту, вы можете получить подобное и более гибкое поведение, сохраняя массив индексов, показывающий, к какому "измерению" принадлежит каждая строка к.

Скорее всего, для приложений ML вы на самом деле не хотите этого:

shape = np.random.randint(1,10,(263,))
arr = np.zeros(shape)  # causes a ValueError anyway

Вы на самом деле хотите что-то редкое

for i, value in enumerate(nonzero_values):
    arr[idx[i]] = value

idx в данном случае это массив (num_samples, 263), а nonzero_values - массив (num_samples,).

Алгоритмы ML обычно работают на этих idx и value массивах (обычно называемых X и Y), поскольку в противном случае фактические массивы были бы огромными.

Иногда вам нужен" горячий " массив ваших измерений, который сделает idx.shape == (num_samples, shape.sum()), С idx содержащим только 0 или 1 ценности. Но это все равно меньше, чем любая высокодиметрическая матрица.

Comments

    Ничего не найдено.