#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, вы можете напрямую обращаться к каждому внешнему элементу, как если бы это был обычный массив.