(Python)对矩阵列的赋值返回所有零';s
我不熟悉Python和NumPy,并且尝试创建一个具有平均规范化和特性缩放的矩阵类。当我运行一个简单的示例时,标准化将返回一列所有的零。我试着寻找它,但只找到了(Python)对矩阵列的赋值返回所有零';s,python,numpy,matrix,Python,Numpy,Matrix,我不熟悉Python和NumPy,并且尝试创建一个具有平均规范化和特性缩放的矩阵类。当我运行一个简单的示例时,标准化将返回一列所有的零。我试着寻找它,但只找到了copy()thingy,这不太适用。代码如下,有什么建议吗 #/usr/bin/env python 将numpy作为np导入 类别矩阵(对象): 定义初始化(self,X=[]): self.X=X self.normalized=False self.\u calcColumnVars() def_calcColumnVars(se
copy()
thingy,这不太适用。代码如下,有什么建议吗
#/usr/bin/env python
将numpy作为np导入
类别矩阵(对象):
定义初始化(self,X=[]):
self.X=X
self.normalized=False
self.\u calcColumnVars()
def_calcColumnVars(self):#这东西有办法和东西
self.mean=np.array([])
self.minimum=np.array([])
self.max=np.array([])
对于范围(0,len(self.X[0])内的ii:
self.mean=np.append(self.mean,np.mean(self.X[:,ii]))
self.minimum=np.append(self.minimum,np.min(self.X[:,ii]))
self.max=np.append(self.max,np.max(self.X[:,ii]))
def规格化(自身):#通过平均值进行偏移并规格化到范围
对于范围(0,len(self.X[0])内的ii:
如果自最小值[ii]==自最大值[ii]:
continue#该列包含所有相同的元素
self.X[:,ii]=(self.X[:,ii]-自平均值[ii])/(自最大值[ii]-自最小值[ii])
self.normalized=True
def显示(自我):
打印“X=%s”%np.array\u str(self.X);
打印“平均值=%s”%np.array\u str(self.Mean,精度=2);
打印“最小值=%s”%np.array\u str(自最小值,精度=2);
打印“Max=%s”%np.array\u str(self.Max,精度=2);
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
X=正规矩阵(np.数组([[1,1,1,1],[89,72,94,69],[1,2,3,4]])。转置()
X.show()
十、规范化
X.show()
我的输出:
X=[[1]
[ 1 72 2]
[ 1 94 3]
[ 1 69 4]]
平均值=[1.81.2.5]
Min=[1.69.1]
Max=[1.94.4]
X=[[1 0]
[1 0 0]
[1 0 0]
[1 0 0]]
平均值=[1.81.2.5]
Min=[1.69.1]
Max=[1.94.4]
当数组具有整数数据类型时,除法返回整数:
In [5]: X = np.array([[1,1,1,1], [89,72,94,69], [1,2,3,4]])
In [7]: X.dtype
Out[7]: dtype('int64')
In [6]: X / 100
Out[6]:
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
相反,如果数组具有浮点数据类型,则除法返回浮点:
In [8]: X = np.array([[1,1,1,1], [89,72,94,69], [1,2,3,4]])
In [9]: X = X.astype(float)
In [11]: X.dtype
Out[11]: dtype('float64')
In [10]: X / 100
Out[10]:
array([[ 0.01, 0.01, 0.01, 0.01],
[ 0.89, 0.72, 0.94, 0.69],
[ 0.01, 0.02, 0.03, 0.04]])
您的代码可以通过更改
self.X = X
在NormMatrix.\uuuu init\uuuu
中:
self.X = np.asarray(X, dtype=float)
此外,您还可以通过删除循环的
来更好地利用NumPy,而不是使用NumPymean
、min
、max
方法。axis=0
参数告诉这些方法在行上取平均值(或min
或max
)。结果是一个数组,每列有一个值。指定axis=0
将删除0轴:
def _calcColumnVars(self): # This thing gets the means and stuff
self.mean = self.X.mean(axis=0)
self.minimum = self.X.min(axis=0)
self.maximum = self.X.max(axis=0)
并通过使用执行归一化算法:
def normalize(self): # Offset by mean and normalize to range
normed = (self.X - self.mean) / (self.maximum - self.minimum)
self.X = np.where(np.isnan(normed), self.X, normed)
self.normalized = True
天哪,我真傻!!!花了一整天的时间在这上面,却没有注意到!!!非常感谢你!如果我使用NumPy广播,有没有办法检查(max-min)是否返回0?如果没有办法,我就不能使用它:(如果X是一个具有浮点数据类型的数组,则除以零返回nan
。在这种情况下,要保留X
的值,可以使用np.isnan
来标识这些位置,并使用np.where
返回一个填充了self.X
wherenp.isnan(X)值的数组。)
为真,而从normed
则为假。(参见上面的代码)。当数组有很多列时,这将比使用for loop
更快。如果数组很小,则for loop
可能更快。更正,在答案的广播部分-应该是“self.X=np.where(np.isnan)(normed),self.X,标准化)