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