尝试规范化numpy.array(版本1.17.4)中的列时出现意外行为

尝试规范化numpy.array(版本1.17.4)中的列时出现意外行为,numpy,array-broadcasting,Numpy,Array Broadcasting,因此,我试图规范化numpy数组中的特定列(即max=1,min=value/max)。 我希望这段代码能起到作用: 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([[

因此,我试图规范化numpy数组中的特定列(即max=1,min=value/max)。 我希望这段代码能起到作用:

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”在哪里? (我把这当作一个“学习机会”)

来自np.arange:

由于您传递了int值,因此将推断数组中的值为int,因此它们不会更改为float,如果需要,可以这样做:

bar = np.arange(12.0).reshape(6,2)
如果您只是执行:

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 1]

要在默认情况下将数组设置为浮点值,请执行以下操作:

bar = np.arange(12, dtype='float').reshape(6,2)
或者,您也可以使用:

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

我们需要在整个程序中更改数组的数据类型并不少见,因为您可能并不总是需要最初定义的数据类型。因此,
.astype()
实际上在各种情况下都非常方便。

作为一句话:通常用浮点除的技巧也不会起作用,因为它不会改变数组的数据类型。感谢您快速而有用的回复。但是,我不应该只说一句谢谢你的话;-),因此,我要补充一个后续问题:是否有一种“有效”或首选的方式?假设我必须对大量数组进行迭代。在字里行间,似乎你建议的最后一种方法是你愿意选择的方法。是这样吗?第一个方法:创建类型为[dtype]的数组。第二种方法:创建[int]类型的数组,然后将int数组转换为浮点数组。第一种方法更有效。也就是说,.astype函数可以在需要时转换数组的类型,而不仅仅是在声明期间。因此,在创建新数组时,请使用第一个方法(dtype=“…”),如果以后需要在代码中更改数组的类型,请使用“.astype(“…”)”
bar = np.arange(12).reshape(6,2).astype('float')