Преобразование списка в массив и изменение формы? - PullRequest
0 голосов
/ 12 мая 2018

Попытка создать массив из 2d точек.

import random
import numpy as np

world_x=500
world_y=500

num_points = 7
points_list = []

def fill_points():
    for i in range(num_points):
        points_list.append(random.randrange(-1*world_x,world_x+1))
        points_list.append(random.randrange(-1*world_y,world_y+1))
    points_array = np.array(points_list)
    points_array.reshape((num_points,2))
    print(points_array)
    print (points_array[0,])
    print (points_array[2,])
    print (points_array[4,])

fill_points()

Возвращает

[ -70 -491 -326  -35 -408  407   94 -330 -493  499  -61  -12   62 -357]
-70
-326
-408

Я ожидал [-70,-491],[-408,-407] и [-493,499]. Я также попытался сделать это, просто используя форму вместо изменения формы, и получил аналогичные результаты. Я неправильно преобразовываю список или неправильно изменяю форму?

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Метод .reshape возвращает новый объект массива , то есть он не работает на месте. Вы можете либо переназначить результаты reshape обратно в ту же переменную, либо напрямую изменить атрибут .shape, который работает на месте:

In [1]: import numpy as np

In [2]: arr = np.arange(10)

In [3]: arr
Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [4]: arr.reshape(2, 5)
Out[4]:
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

In [5]: arr
Out[5]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

С другой стороны:

In [6]: arr.shape = 2, 5

In [7]: arr
Out[7]:
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

Или используйте метод .resize для модификаций на месте:

In [8]: arr = np.arange(4)

In [9]: arr
Out[9]: array([0, 1, 2, 3])

In [10]: arr.resize(2, 2)

In [11]: arr
Out[11]:
array([[0, 1],
       [2, 3]])

Примечание: различные объекты массива могут совместно использовать один и тот же базовый буфер , поэтому имейте в виду, что это происходит:

In [12]: arr = np.arange(10)

In [13]: arr
Out[13]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [14]: arr2 = arr.reshape(2, 5)

In [15]: arr
Out[15]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [16]: arr2
Out[16]:
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

In [17]: arr[0] = 99

In [18]: arr
Out[18]: array([99,  1,  2,  3,  4,  5,  6,  7,  8,  9])

In [19]: arr2
Out[19]:
array([[99,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9]])

Таким образом, это делает метод переназначения относительно дешевым:

In [20]: arr = arr.reshape(2, 5)

In [21]: arr
Out[21]:
array([[99,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9]])

Обратите внимание, я стараюсь избегать .resize, потому что вы можете случайно сделать:

In [33]: arr = np.arange(4)

In [34]: arr.resize(4,4)

In [35]: arr
Out[35]:
array([[0, 1, 2, 3],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])

Но он, по крайней мере, предупредит вас ... если будут ссылаться на другие массивы:

In [36]: arr = np.arange(4)

In [37]: arr2 = arr.reshape(2,2)

In [38]: arr
Out[38]: array([0, 1, 2, 3])

In [39]: arr2
Out[39]:
array([[0, 1],
       [2, 3]])

In [40]: arr.resize(4,4)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-40-c4464d98ed0e> in <module>()
----> 1 arr.resize(4,4)

ValueError: cannot resize an array that references or is referenced
by another array in this way.  Use the resize function

Однако вы можете изменить это поведение на свой страх и риск:

In [41]: arr.resize(4,4, refcheck=False)

In [42]: arr
Out[42]:
array([[0, 1, 2, 3],
       [0, 0, 0, 0],
       [0, 0, 0, 0],
       [0, 0, 0, 0]])

In [43]: arr2
Out[43]:
array([[4611686018427387904, 4611686018427387904],
       [                  6,                   0]])
0 голосов
/ 12 мая 2018

Похоже, вы хотите сохранить вместе x и y шнуры, попробуйте добавить их в список. E.g.:

import random
import numpy as np

world_x=500
world_y=500

num_points = 7
points_list = []

def fill_points():
    for i in range(num_points):
        points_list.append([random.randrange(-1*world_x,world_x+1),
                            random.randrange(-1*world_y,world_y+1)])
    points_array = np.array(points_list)
    print(points_array)
    print (points_array[0,0])
    print (points_array[2,0])
    print (points_array[4,0])

fill_points()

Выходы:

[[ 354 -147]
 [ 193  288]
 [ 157 -319]
 [ 133  426]
 [-109  -54]
 [ -61  224]
 [-251 -411]]
354
157
-109

Или, если вы хотите использовать изменение формы. Помните, что изменение формы возвращает новый список, оно не меняет введенный вами список:

def fill_points():
    for i in range(num_points):
        points_list.append(random.randrange(-1*world_x,world_x+1))
        points_list.append(random.randrange(-1*world_y,world_y+1))
    points_array = np.array(points_list).reshape((num_points,2))
    print(points_array)
    print (points_array[0,0])
    print (points_array[2,0])
    print (points_array[4,0])

fill_points()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...