Неожиданное поведение при попытке нормализовать столбец в numpy .array (версия 1.17.4) - PullRequest
0 голосов
/ 09 апреля 2020

Итак, я пытался нормализовать (т.е. max = 1, min = value / max) указанный столбец c в массиве numpy. Я надеялся, что этот кусок кода справится с задачей:

bar = np.arange(12).reshape(6,2)

bar
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])

bar[:,1] = bar[:,1] / bar[:,1].max()
bar
array([[ 0,  0],
       [ 2,  0],
       [ 4,  0],
       [ 6,  0],
       [ 8,  0],
       [10,  1]])

работает, как и ожидалось, если тип каждого значения 'float'.

foo = np.array([[1.1,2.2],
               [3.3,4.4],
               [5.5,6.6]])
foo[:,1] = foo[:,1] / foo[:,1].max()

foo
array([[1.1       , 0.33333333],
       [3.3       , 0.66666667],
       [5.5       , 1.        ]])

Я думаю, что я спрашиваю где по умолчанию это int, я здесь скучаю? (Я воспринимаю это как «возможность обучения»)

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Если вы просто выполните:

out = bar[:,1] / bar[:,1].max()
print(out)
>>> [0.09090909 0.27272727 0.45454545 0.63636364 0.81818182 1.        ]

Это работает просто отлично, поскольку out - это недавно созданный массив с плавающей точкой, созданный для хранения этих значений с плавающей точкой. Но np.arange(12) дает вам массив int по умолчанию. bar[:,1] = bar[:,1] / bar[:,1].max() пытается сохранить значения с плавающей точкой внутри целочисленного массива, и все значения становятся целыми числами, и вы получаете [0 0 0 0 0 1].

Чтобы установить массив как число с плавающей точкой по умолчанию:

bar = np.arange(12, dtype='float').reshape(6,2)

В качестве альтернативы вы также можете использовать:

bar = np.arange(12).reshape(6,2).astype('float')

Нам нередко приходится менять тип данных массива во всей программе, поскольку вам не всегда может понадобиться тип d, который вы определили изначально , Так что .astype() на самом деле очень удобно для всех видов сценариев ios.

0 голосов
/ 09 апреля 2020

Из документации np.arange :

dtype : dtype
The type of the output array. If dtype is not given, infer the data type from the other input arguments.

Поскольку вы передали значения int, это будет означать, что значения в массиве являются целыми, и поэтому они не изменятся на float, Вы можете сделать это, если хотите:

bar = np.arange(12.0).reshape(6,2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...