给定NumPy数组A,将相同函数f应用于每个单元格的最快/最有效的方法是什么?
假设我们将分配给A(I,J)的F(A(I,J)) .
函数f没有二进制输出,因此掩码(ing)操作无济于事.
"明显的"双循环迭代(通过每个单元格)是最优解吗?
我有以下代码试图规范化m x n
数组的值(它将用作神经网络的输入,其中m
是训练示例n
的数量,并且是特征的数量).
但是,当我在脚本运行后检查解释器中的数组时,我发现这些值没有规范化; 也就是说,它们仍然具有原始值.我想这是因为array
函数内部变量的赋值只能在函数中看到.
我怎样才能实现这种规范化?或者我必须从normalize函数返回一个新数组?
import numpy
def normalize(array, imin = -1, imax = 1):
"""I = Imin + (Imax-Imin)*(D-Dmin)/(Dmax-Dmin)"""
dmin = array.min()
dmax = array.max()
array = imin + (imax - imin)*(array - dmin)/(dmax - dmin)
print array[0]
def main():
array = numpy.loadtxt('test.csv', delimiter=',', skiprows=1)
for column in array.T:
normalize(column)
return array
if __name__ == "__main__":
a = main()
Run Code Online (Sandbox Code Playgroud) 是否可以将函数应用于pandas 中的DataFrame 中的每个单元格?
我知道pandas.DataFrame.applymap但它似乎不允许就地应用程序:
import numpy as np
import pandas as pd
np.random.seed(1)
frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),
index=['Utah', 'Ohio', 'Texas', 'Oregon'])
print(frame)
format = lambda x: '%.2f' % x
frame = frame.applymap(format)
print(frame)
Run Code Online (Sandbox Code Playgroud)
收益:
b d e
Utah 1.624345 -0.611756 -0.528172
Ohio -1.072969 0.865408 -2.301539
Texas 1.744812 -0.761207 0.319039
Oregon -0.249370 1.462108 -2.060141
b d e
Utah 1.62 -0.61 -0.53
Ohio -1.07 0.87 -2.30
Texas 1.74 -0.76 0.32
Oregon -0.25 1.46 -2.06
Run Code Online (Sandbox Code Playgroud)
frame = frame.applymap(format) …
我有一个numpy
数组和该数组中的有效值列表:
import numpy as np
arr = np.array([[1,2,0], [2,2,0], [4,1,0], [4,1,0], [3,2,0], ... ])
valid = [1,4]
Run Code Online (Sandbox Code Playgroud)
是否有一种很好的pythonic方法可以将所有数组值设置为零,这些方法不在有效值列表中并就地执行?执行此操作后,列表应如下所示:
[[1,0,0], [0,0,0], [4,1,0], [4,1,0], [0,0,0], ... ]
Run Code Online (Sandbox Code Playgroud)
以下内容在内存中创建了一个数组副本,这对大型数组不利:
arr = np.vectorize(lambda x: x if x in valid else 0)(arr)
Run Code Online (Sandbox Code Playgroud)
它让我烦恼,现在我遍历每个数组元素并将其设置为零(如果它在valid
列表中).
编辑:我找到了一个答案,表明没有就地功能来实现这一目标.也停止改变我的空白.更容易看到arr
它们的变化.
我有一个大的矢量场,其中场很大(例如512 ^ 3;但不一定是正方形),矢量是2D或3D(例如形状是[512,512,512,2]或[512,512, 512,3]).
计算向量的平方幅度的标量场的最快方法是什么?
我可以绕过每个方向,即
import numpy as np
shp = [256,256,256,3] # Shape of vector field
vf = np.arange(3*(256**3)).reshape(shp) # Create vector field
sf = np.zeros(shp[:3]) # Create scalar field for result
for ii in range(shp[0]):
for jj in range(shp[1]):
for kk in range(shp[2]):
sf[ii,jj,kk] = np.dot( vf[ii,jj,kk,:] , vf[ii,jj,kk,:] )
Run Code Online (Sandbox Code Playgroud)
但那是相当缓慢的,有什么更快的吗?
假设您有一个包含3或4个元素的numpy数组
例如:
3
4
4
4
3
3
3
Run Code Online (Sandbox Code Playgroud)
我想改变这个数组,这样如果一个元素是3,那么它应该变成一个数字X,如果元素是4,它应该变成一个数字Y.保证X不同于Y.对于上面的数组我们会得到:
X
Y
Y
Y
X
X
X
Run Code Online (Sandbox Code Playgroud)
我在考虑做这样的事情:
arr[arr==3]=X
arr[arr==4]=Y
Run Code Online (Sandbox Code Playgroud)
但是,如果X是4呢?然后最后整个数组将只包含Ys.
我试图避免出于性能原因使用for循环,但如果这是唯一的方法,我可以负担得起遵循该路线.