我正在尝试完成斯坦福 cs244n 课程的作业 1。问题 1b 强烈推荐对 Softmax 函数进行优化。我设法得到了 N 维向量的 Softmax。我还得到了 MxN 维矩阵的 Softmax,但在列中使用了 for 循环。我有以下代码:
def softmax(x):
orig_shape = x.shape
# Matrix
if len(x.shape) > 1:
softmax = np.zeros(orig_shape)
for i,col in enumerate(x):
softmax[i] = np.exp(col - np.max(col))/np.sum(np.exp(col - np.max(col)))
# Vector
else:
softmax = np.exp(x - np.max(x))/np.sum(np.exp(x - np.max(x)))
return softmax
Run Code Online (Sandbox Code Playgroud)
我可以实现更优化的 Matrix 实现吗?
我想用 2 列缩放矩阵 (X)。我正在使用均值归一化,并在 Octave 中写了以下几行:
X_norm = X
mu = mean(X);
sigma = std(X);
X_norm(:,1) = (X_norm(:,1) .- mu(:,1)) ./ sigma(:,1);
X_norm(:,2) = (X_norm(:,2) .- mu(:,2)) ./ sigma(:,2);
Run Code Online (Sandbox Code Playgroud)
你能告诉我一种更简洁的方法来矢量化这些计算吗?
我通过与结果进行比较来检查我的代码zscore(X)并且它们匹配 - 即sum(X_norm - zscore(X))返回了我 0 0。
我被限制不使用zscore(),因此问题。
样本数据如下:
2104 3
1600 3
2400 3
1416 2
3000 4
1985 4
1534 3
1427 3
1380 3
1494 3
1940 4
2000 3
1890 3
4478 5
1268 3
2300 4
1320 2
1236 …Run Code Online (Sandbox Code Playgroud) 我很好奇为什么ifelse()调用中的语句dplyr::mutate()似乎只适用于我的数据框的第一行。这将返回一个值,该值在整个列中循环使用。由于在这两种情况下评估的表达式ifelse()仅在我的数据框上下文中有效,我希望条件检查和结果表达式评估作为一个整体对列执行,而不仅仅是它们的第一个元素。
这是一个例子:我在数据框外定义了一个名为checkVar. 根据 的值checkVar,我想将不同的值添加到新列 中的数据框中z,这些值是作为现有列的函数计算的。
如果我做
checkVar <- 1
df <- data.frame( x=11:15, y=1:5 ) %>%
dplyr::mutate( z=ifelse(checkVar == 1, x/y, x-y) )
df
Run Code Online (Sandbox Code Playgroud)
它返回
x y z
1 11 1 11
2 12 2 11
3 13 3 11
4 14 4 11
5 15 5 11
Run Code Online (Sandbox Code Playgroud)
z 不是每行的 x 和 y 的商,而是所有行都填充有来自数据帧第一行的 x 和 y 的商。
但是,如果我指定rowwise(),我会得到我想要的结果:
df <- df %>%
dplyr::rowwise() %>%
dplyr::mutate( …Run Code Online (Sandbox Code Playgroud) 我正在使用 Pandas 向量化 str.split() 方法来提取从“~”上的拆分返回的第一个元素。我还尝试将 df.apply() 与 lambda 和 str.split() 一起使用来产生等效的结果。使用 %timeit 时,我发现 df.apply() 的执行速度比矢量化版本快。
我读到的关于矢量化的所有内容似乎都表明第一个版本应该有更好的性能。有人可以解释为什么我得到这些结果吗?例子:
id facility
0 3466 abc~24353
1 4853 facility1~3.4.5.6
2 4582 53434_Facility~34432~cde
3 9972 facility2~FACILITY2~343
4 2356 Test~23 ~FAC1
Run Code Online (Sandbox Code Playgroud)
上面的数据框有大约 500,000 行,我也测试了大约 100 万行,结果相似。以下是一些示例输入和输出:
矢量化
id facility
0 3466 abc~24353
1 4853 facility1~3.4.5.6
2 4582 53434_Facility~34432~cde
3 9972 facility2~FACILITY2~343
4 2356 Test~23 ~FAC1
Run Code Online (Sandbox Code Playgroud)
Lambda 应用
In [1]: %timeit df['facility'] = df['facility'].str.split('~').str[0]
1.1 s ± 54.4 ms per loop (mean ± std. dev. of 7 runs, …Run Code Online (Sandbox Code Playgroud) import random
def sp_noise(image,prob):
'''
Add salt and pepper noise to image
prob: Probability of the noise
'''
output = np.zeros(image.shape,np.uint8)
thres = 1 - prob
for i in range(image.shape[0]):
for j in range(image.shape[1]):
rdn = random.random()
if rdn < prob:
output[i][j] = 0
elif rdn > thres:
output[i][j] = 255
else:
output[i][j] = image[i][j]
return output
Run Code Online (Sandbox Code Playgroud)
这就是我想要达到的目标。我知道此函数不使用矢量化,但我不知道在这种情况下如何摆脱循环。如果有像素值的条件,那将是微不足道的。但在这种情况下,索引或像素值没有条件,我只需要保留像素值,或者根据随机变量的值将其设置为 0 或 1。
我如何矢量化?
我的目标是找到最接近单个点的段(在段数组中)。获取 2D 坐标数组之间的点积有效,但使用 3D 坐标会出现以下错误:
*ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 3)*
A = np.array([[1,1,1],[2,2,2]])
B = np.array([[3,3,3], [4,4,4]])
dp = np.dot(A,B)
Run Code Online (Sandbox Code Playgroud)
dp应该返回2个值的点积[1,1,1]@[3,3,3]和[2,2,2]@[4,4,4]
// 谢谢大家。
这是找到最接近单个点的线段的最终解决方案。
欢迎任何优化。
import numpy as np
import time
#find closest segment to single point
then = time.time()
#random line segment
l1 = np.random.rand(1000000, 3)*10
l2 = np.random.rand(1000000, 3)*10
#single point
p = np.array([5,5,5]) #only single …Run Code Online (Sandbox Code Playgroud) 鉴于n,我想将向量的最后一个n字节归零__m128i。
例如,考虑以下__m128i向量:
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
将最后一个n = 4字节归零后,向量应如下所示:
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111 00000000 00000000 00000000 00000000
是否有执行此操作的 SSE 内在函数(通过接受__128i向量和n作为参数)?
我有一个a值数组,其值在每个索引处idx我想重复一定b[idx]次数,idx在另一个数组 ( b)中的相同索引处给出,如下所示:
a = numpy.array([1, 2, 3 ,4, 5])
b = numpy.array([2, 3, 1, 2, 4])
Run Code Online (Sandbox Code Playgroud)
期望的输出:
c = numpy.array([1, 1, 2, 2, 2, 3, 4, 4, 5, 5, 5, 5])
Run Code Online (Sandbox Code Playgroud)
我意识到我可以做这样的事情:
len_a = numpy.shape(a)[0]
sum_b = sum(b)
c = numpy.zeros((1, 0))
for idx in range(len_a):
repeated_a = numpy.repeat(a[idx], b[idx])
repeated_a = numpy.reshape(repeated_a, (1, numpy.shape(repeated_a)[0]))
c = numpy.hstack((c, repeated_a))
Run Code Online (Sandbox Code Playgroud)
但是,循环不是一个好的选择,因为它很慢。 我将如何让这个更快?也许某种形式的矢量化。
在 C# 中,我习惯了数据集和当前记录的概念。对我来说,用当前记录的条件编写一个复杂的计算价格函数会很容易。
我无法理解如何在 r 中执行此操作。
我尝试了以下
train <- read.csv("Train.csv" )
df <- as.data.frame.matrix(train)
v = c( df$Fuel.Type ,df$No.Gears)
names(v ) <- c( "FuelType" ,"NoGears")
df$FEType = FEType( v)
Run Code Online (Sandbox Code Playgroud)
其中 my 函数定义为
FEType <- function(v ){
ret="Low"
if (v["FuelType"]=='G') {
ret ="High"
}
return(ret)
}
Run Code Online (Sandbox Code Playgroud)
这不像我预期的那样工作,当我检查 v 时,我看到它包含汇总总数而不是我预期的当前行。
我哪里错了?
为了重现问题,表明我想做什么,我有
IsPretty <-function(PetalWidth){
if (PetalWidth >0.3) return("Y")
return("N")
}
df <- iris
df$Pretty = IsPretty(df$Petal.Width)
Run Code Online (Sandbox Code Playgroud)
这给出了错误
条件的长度 > 1 并且只使用第一个元素
这让我开始研究向量。但我不相信这是正确的方向。
[更新]
我习惯于考虑表格和当前记录。因此我在想
df$Pretty = IsPretty(df$Petal.Width) …Run Code Online (Sandbox Code Playgroud) 我想在 Julia 中安装devectorize 包,但我遇到了问题。我跑
(@v1.5) pkg> add Devectorize
ERROR: The following package names could not be resolved:
* Devectorize (not found in project, manifest or registry)
Run Code Online (Sandbox Code Playgroud)
我也试过
Pkg.add("Devectorize")
Run Code Online (Sandbox Code Playgroud)
同样的结果。不再支持 Devectorize 吗?
vectorization ×10
python ×5
numpy ×4
r ×2
arrays ×1
c ×1
conditional ×1
dot-product ×1
dplyr ×1
if-statement ×1
julia ×1
mutate ×1
octave ×1
package ×1
pandas ×1
performance ×1
simd ×1
softmax ×1
split ×1
sse ×1
string ×1