Перебор 2D массива с помощью python

#python #arrays

Вопрос:

Я хочу хранить точки в массиве, но я не уверен, как это сделать.

 x = np.dot(weights, corners) x_points = np.zeros([100, 2]) for i in range(101):  x_points = (x   corners[np.random.randint(3)]) / 2  x = x_points  

Я попытался повторить свой массив следующим образом:

 x = np.dot(weights, corners) x_points = np.zeros([100, 2]) for i in range(101):  x_points[i:,] = (x   corners[np.random.randint(3)]) / 2  x = x_points  

Как я сохраняю каждую точку в своем массиве?

Комментарии:

1. Итак x , это массив точек 100×2, и вы хотите усреднить его с помощью некоторых случайных значений corners ?

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

Ответ №1:

Цикл «Вы для» предназначен для перебора вашего количества точек, но вы никогда специально не выбираете i-ю строку из исходного x массива для работы; вместо этого вы просто используете весь массив на каждой итерации. Вот что вам следует делать:

 for i in range(101):  x_points[i,:] = (x[i,:]   ...) / 2  

(Обратите внимание, что вы даже можете опустить второй индекс, если захотите: x[i] это то же самое, что x[i,:] .)

Кроме того, вы неправильно индексируете для хранения в x_points массиве. Я предполагаю, что вы хотели написать x_points[i,:] так, как я написал выше, а x_points[i:,] не . Последний разрезает массив от i-й строки до конца вдоль первой оси, так что ваш код фактически изменит более одной строки x_points за раз.

Наконец, я не понимаю, почему вы назначаете x = x_points на каждой итерации цикла. Таким образом, после первого запуска цикла ваш исходный x массив больше не существует. Если вы хотите «переименовать» завершенный x_points , вам нужно поместить эту строку после цикла for.

Комментарии:

1. x = x_points заменяет старую точку новой точкой, x[i 1] = x[i] c[i] / 2. Должен ли я также индексировать углы?

2. Я пытаюсь использовать то, что вы предложили: x_points[i,:] = (x[i] (углы[np.random.randint(3)])[i,:]) / 2, но получаю ошибку: ошибка типа: индексы кортежей должны быть целыми числами или срезами, а не кортежем.

3. Почему x[i 1] именно сейчас? Вы пытаетесь заменить точки ниже текущей строки, с которой работаете? Ты никогда не упоминал об этом. Я все еще не совсем уверен, чего вы пытаетесь достичь.

4. Что касается другой вашей ошибки, вы случайным образом захватываете одну из первых трех строк corners , но почему вы пытаетесь проиндексировать ее снова? Разве вы просто не хотите добавить эту строку к текущей из x ?

5. Я сдаюсь, мой код выдает следующую ошибку: x_points[i, :] = (x (углы[np.random.randint(3)])) / 2 Ошибка значения: не удалось передать входной массив из формы (100,2) в форму (2,)

Ответ №2:

Использование Numpy

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

 gt;gt;gt; weights = np.random.randn(10,4) gt;gt;gt; corners = np.random.rand(4,2) gt;gt;gt; x=np.dot(weights, corners) gt;gt;gt; x array([[ 0.41183813, 0.18830351],  [ 0.10599174, 0.76246711],  [ 0.50235149, 2.76642114],  [ 0.17072047, 0.67126034],  [-0.25400796, -1.20589651],  [-0.04360992, -0.06102023],  [ 0.0446144 , 0.48355716],  [ 0.8501312 , 1.93899732],  [ 0.44656254, 1.05180096],  [ 0.00397146, 0.19248246]]) gt;gt;gt; x_points = np.zeros([10, 2])  

Теперь у вас есть набор точек x_, инициализированных до 0.0, и ваше точечное произведение весов и углов в x.

 for i in range(len(x_points)):  x_points[i] = (x[i]   corners[np.random.randint(3)]) / 2   

Все ваши случайно инициализированные точки, которые принимали значения x, и учитываемые углы были записаны в x_points.

 gt;gt;gt; x_points array([[ 0.33206919, 0.25078735],  [ 0.17914599, 0.53786916],  [ 0.46472124, 1.74498146],  [ 0.29890573, 0.69740106],  [-0.08596056, -0.17476289],  [ 0.01923846, 0.39767525],  [ 0.14845732, 0.39841418],  [ 0.46610902, 1.39768402],  [ 0.43682676, 0.88767137],  [ 0.04302915, 0.52442659]])  

Для простых 2D массивов Python

Вы создаете 2D массив следующим образом:

 matrix = [[0 for x in range(num_cols)] for y in range(num_rows)]  

Затем вы получаете к нему доступ, как к списку с индексом:

 matrix[2][3] = 23  for i in range(num_rows):  for j in len(num_cols):  print(f"The element in the {i}th row, {j}th col is {matrix[i][j]}")  

Комментарии:

1. Есть ли другой способ, более похожий на мой исходный код? Я должен также упомянуть, что углы-это вектор, содержащий точки.

2. Добавлена реализация на основе numpy. Совет: когда ваши размеры при использовании numpy, вы можете напрямую обращаться к каждому внешнему элементу, как если бы это был обычный массив.