NumPy массив против списка списков? - PullRequest
0 голосов
/ 30 апреля 2018

РЕДАКТИРОВАТЬ: я изменил np.array на np.arange, чтобы лучше объяснить, в чем моя проблема.

Будучи новичком в Python, я все еще много борюсь со структурами данных. Кажется, что это должен быть очень очевидный (и, очевидно, дублирующий) вопрос, но я не могу понять достаточно других объяснений, чтобы заставить его работать.

Мне нужно создать список списков (и / или массивов, я объясню это через минуту), все с различной длиной и диапазоном. Я установил свои начальные массивы следующим образом, но я все еще не понимаю, как создать массив 'partotal'. Я знаю, что синтаксис неправильный, но до сих пор не понимаю, почему.

import numpy as np

par1 = np.arange([10,80,1])
par2 = np.arange([50,120,1])
par3 = np.arange([0,40,1])
par4 = np.arange([0,30,1])

partotal = np.array([par1][par2][par3][par4])

Вторая проблема, как вы уже догадались, заключается в том, что я понятия не имею, должен ли я использовать массивы, списки, панды или что-то еще целиком. Поскольку все мои массивы имеют разную длину, мне трудно понять, как собрать вещи или удалить их снова.

EDIT: цель partotal - создать набор начальных позиций для другой функции (см. Ниже)

inputnumber = 200

def positions(partotal, inputnumber):
    return np.random.uniform(partotal, size=(inputnumber, len(partotal)))

Я знаю, что это должно звучать очень просто, но как новичок я нахожу это запутанным и трудным. Большинство ответов сосредоточены на синтаксисе и не помогают развить истинное понимание. Если кому-то понадобится время, чтобы объяснить очевидное, я был бы признателен.

ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: Ответ был очень прост, когда я понял свою проблему. Я не буду удалять остальную часть поста ради тех, кому, возможно, придется следить за моим мыслительным процессом.

par = 3
par1 = np.random.uniform(10,80,size=par)
par2 = np.random.uniform(5,120,size=par)
par3 = np.random.uniform(0,40,size=par)

allpar = np.array([par1,par2,par3])

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Обычно uniform используется для указания скалярных значений start и stop и формы:

In [101]: np.random.uniform(0,1,size=(3,4))
Out[101]: 
array([[0.87953793, 0.83726369, 0.53280941, 0.69611469],
       [0.78369061, 0.99258945, 0.65533223, 0.8342177 ],
       [0.69943211, 0.53965698, 0.06419811, 0.36591087]])

Это 12 значений, взятых из [0,1), расположенных в массиве (3,4).

В документации сказано, что start и stop могут быть массивами, но не очень понятно, как они используются. Лучшая подсказка в:

np.broadcast(low, high).size образцы взяты.

Таким образом, пробуя (3,1) и (1,4) входные данные, мы снова получаем массив (3,4).

In [102]: np.random.uniform(np.zeros((3,1)), np.ones((1,4)))
Out[102]: 
array([[0.35865707, 0.39068231, 0.9117642 , 0.49346499],
       [0.1439195 , 0.1217748 , 0.21780452, 0.83235673],
       [0.24894503, 0.36413268, 0.51516651, 0.8480244 ]])

Чтобы сгенерировать 3 числа из (0,1), (10,11) и (20,21) соответственно:

In [105]: np.random.uniform(np.arange(0,30,10), np.arange(1,31,10))
Out[105]: array([ 0.54715093, 10.75390957, 20.98101312])

Я не знаю, что вы пытаетесь сделать с этими 4 массивами.

In [107]: par1 = np.arange(10,80)     # corrected usage
     ...: par2 = np.arange(50,120)
     ...: par3 = np.arange(0,40)
     ...: par4 = np.arange(0,30)

Я мог бы объединить эти 4 массива в один:

In [108]: par = np.concatenate([par1,par2,par3,par4])
In [109]: par.shape
Out[109]: (210,)

При различной длине эта hstack является единственной опцией.

Обратите внимание, что я создал список этих массивов и использовал его в качестве входных данных для concatenate (как и ожидалось).

In [110]: alist = [par1,par2,par3,par4]

Список списков или список массивов - это простая конструкция Python. Это, безусловно, следует использовать, прежде чем пытаться создать массив массивов (разных размеров). Но я не понимаю, как это относится к uniform (как я только что проиллюстрировал).

Другой (3,4) массив случайных значений:

In [111]: np.random.uniform(np.arange(3)[:,None], np.arange(4))
Out[111]: 
array([[0.        , 0.74651856, 0.60318064, 0.75254649],
       [0.49864947, 1.        , 1.60558937, 2.06444058],
       [1.03298196, 1.80321816, 2.        , 2.3358475 ]])

Каждый элемент взят из другого диапазона

 [0,0) [0,1) [0,2)
 [1,0) [1,1) [1,2)
 [2,0) ...
0 голосов
/ 30 апреля 2018

Спасибо всем за помощь в том, что, как я понимаю, это был чрезвычайно плохо сформулированный вопрос. Ответ оказался довольно простым:

val = 4 # or any required number of start points
par1 = np.random.uniform(10,60,size=val)
par2 = np.random.uniform(0,20,size=val)
par3 = np.random.uniform(0,30,size=val)

allpar = np.array([par1,par2,par3])

Это дает мне массив правильных значений с правильным количеством случайно сгенерированных точек в указанных границах.

Спасибо всем, кто внес свой вклад.

0 голосов
/ 30 апреля 2018

Если вы пытаетесь создать 2d массив, вы можете просто передать 2d список в np.array.

np.array([[10, 80, 1], [50, 120, 1], [0, 40, 1], [0, 30, 1]])

Не уверен, что это то, что вы собираетесь, но в вашем конкретном случае вы бы сделали:

partotal = np.array([par1, par2, par3, par4])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...