问题与此处相同,但在 R 中。我有一个矩阵和一个向量,使得
length(vec) == nrow(mat)
Run Code Online (Sandbox Code Playgroud)
我如何获得这样的向量
v[i] == mat[v[i],i]
Run Code Online (Sandbox Code Playgroud)
我试图通过使用逻辑矩阵来实现这一点:
>a = matrix(runif(12),4,3)
a
[,1] [,2] [,3]
[1,] 0.6077585 0.5354680 0.2802681
[2,] 0.2596180 0.6358106 0.9336301
[3,] 0.5317069 0.4981082 0.8668405
[4,] 0.6150885 0.5164009 0.5797668
> sel = col(a) == c(1,3,2,1)
> sel
[,1] [,2] [,3]
[1,] TRUE FALSE FALSE
[2,] FALSE FALSE TRUE
[3,] FALSE TRUE FALSE
[4,] TRUE FALSE FALSE
> a[sel]
[1] 0.6077585 0.6150885 0.4981082 0.9336301
Run Code Online (Sandbox Code Playgroud)
它选择了正确的元素,但弄乱了顺序。我想使用mapply任何一个,但我不知道如何让它遍历行,就像在apply.
upd:@gsk3 建议使用as.list(as.data.frame(t(a)))这个作品。但我仍然想知道是否有更矢量化的方式,没有列表。
我想对矩阵的每 n 列求和。如何在不使用 for 循环的情况下以简单的方式做到这一点?这就是我现在所拥有的:
n = 3 #size of a block we need to sum over
total = 4 #total required sums
ncols = n*total
nrows = 10
x = np.array([np.arange(ncols)]*nrows)
result = np.empty((total,nrows))
for i in range(total):
result[:,i] = np.sum(x[:,n*i:n*(i+1)],axis=1)
Run Code Online (Sandbox Code Playgroud)
结果将是
array([[ 3., 12., 21., 30.],
[ 3., 12., 21., 30.],
...
[ 3., 12., 21., 30.]])
Run Code Online (Sandbox Code Playgroud)
如何矢量化此操作?
我想使用单行语句在 Fortran 中执行以下伪代码的do-end do位:
integer, parameter :: N = 1000
integer, dimension(1:N) :: ArrayA, ArrayB
logical, dimension(1:N) :: ArrayL
...
...
do i = 1, N
if( ArrayA(i) <= ArrayB(i) ) then
ArrayL(i) = .true.
else
ArrayL(i) = .false.
end if
end do
Run Code Online (Sandbox Code Playgroud)
这可能吗?如果是这样,我该怎么做?
我有一个 3-d Numpy 数组flow,如下所示:
flow = np.random.uniform(low=-1.0, high=1.0, size=(720,1280,2))
# Suppose flow[0] are x-coordinates. flow[1] are y-coordinates.
Run Code Online (Sandbox Code Playgroud)
需要计算每个 x,y 点的角度。这是我如何实施它:
def calcAngle(a):
assert(len(a) == 2)
(x, y) = a
# angle_deg = 0
angle_deg = np.angle(x + y * 1j, deg=True)
return angle_deg
fangle = np.apply_along_axis(calcAngle, axis=2, arr=flow)
# The above statement takes 14.0389318466 to execute
Run Code Online (Sandbox Code Playgroud)
每个点的角度计算需要14.0389318466 seconds在我的 Macbook Pro 上执行。
有没有一种方法可以加快速度,可能是通过使用一些矩阵运算,而不是一次处理一个像素。
使用索引列表和应用函数切片 numpy 数组,是否可以矢量化(或非矢量化的方式来做到这一点)?向量化将是大型矩阵的理想选择
import numpy as np
index = [[1,3], [2,4,5]]
a = np.array(
[[ 3, 4, 6, 3],
[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[1, 1, 4, 5]])
Run Code Online (Sandbox Code Playgroud)
按 中的行索引组求和index,给出:
np.array([[8, 10, 12, 14],
[17, 19, 24, 37]])
Run Code Online (Sandbox Code Playgroud) 我有两个数据框df1和df2.
我试图找出执行的映射,对于在每一行的最好方式df1,我想搜索匹配(id,time_by_hour)中df2,然后填入相应的值df2回df1。
下面是df1_final我希望它最终看起来的样子。
先感谢您!
df1
Out[100]:
id time_by_min time_by_hour value
0 a 2017-06-30 01:25:00.000 2017-06-30 02:00:00 NaN
1 a 2017-06-30 01:36:32.308 2017-06-30 02:00:00 NaN
2 a 2017-06-30 02:25:00.000 2017-06-30 03:00:00 NaN
3 a 2017-06-30 02:36:32.308 2017-06-30 03:00:00 NaN
4 b 2017-06-30 01:25:00.000 2017-06-30 02:00:00 NaN
5 b 2017-06-30 01:36:32.308 2017-06-30 02:00:00 NaN
6 b 2017-06-30 02:25:00.000 2017-06-30 03:00:00 NaN
df2
Out[101]:
id …Run Code Online (Sandbox Code Playgroud) 我试图意识到为什么我不能使用dplyr::case_when而不是dplyr::if_else.
可能我错过了一些东西。让我解释:
我得到了这个工作正常的操作:
df %>%
mutate(
keep = if_else(
assembly_level != "Complete Genome" | genome_rep != "Full",
FALSE,
ifelse(
version_status == "suppressed",
FALSE,
if_else(
refseq_category %in% c("reference genome", "representative genome"),
TRUE,
if_else(
rpseudo > 0.4,
FALSE,
TRUE
)
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用case_when这种方式时
df %>%
mutate(
keep = case_when(
assembly_level != "Complete Genome" | genome_rep != "Full" ~ FALSE,
version_status == "suppressed" ~ FALSE,
refseq_category %in% c("reference genome", "representative genome") ~ TRUE,
rpseudo > …Run Code Online (Sandbox Code Playgroud) 说,我有一个由20个元素组成的2D numpy数组,例如:
arr = np.array([[1, 2, 15, 7],[9, 11, 17, 19],[5, 7, 5, 8],[19, 4, 1, 45],[10, 7, 14, 8]])
Run Code Online (Sandbox Code Playgroud)
和一个额外的数组:
to_zero = np.array([0, 2, 1, 3, 2])
Run Code Online (Sandbox Code Playgroud)
现在,对于每一行,i我想使最后一个to_zero[i]元素等于零,因此最终我们将得到以下结果:
res = np.array([[1, 2, 15, 7],[9, 11, 0, 0],[5, 7, 5, 0],[19, 0, 0, 0],[10, 7, 0, 0]])
Run Code Online (Sandbox Code Playgroud)
我想在很大的数组上执行此操作。有什么方法可以向量化此操作,没有循环,也没有辅助数组吗?
我正在尝试围绕矢量化(用于数值计算)进行思考,但我遇到了看似矛盾的解释:
我的理解是,它是一个内置于低级库的功能,它利用给定处理器的并行处理能力同时对多个数据点执行操作。
但是一些教程似乎将其描述为一种编码实践,可以将其合并到他们的代码中以提高效率。如果它也是您正在使用的框架中拥有或没有的功能,那么它是如何编码实践的。
对我的困境更具体的解释:
据我所知,了解 Numpy 以及如何导入和使用它并不是一种编码实践。这只是工具和框架的良好知识,仅此而已。
那么为什么人们一直将矢量化称为优秀编码人员在其代码中利用的编码实践呢?
变量:
x 和 y 是形状为 (N, 2) 的 N 个二维向量数组。
题:
有没有办法在两个数组中对应于相同位置的向量之间执行点积,而无需像列表理解那样显式地编写元素:[np.dot(x[i], y[i]) for i in range(N)] ?
通常,在 numpy 的其他函数中,我使用该选项axis = 1来实现这一点,但我发现 np.dot 中不存在它。有没有办法设法矢量化这个操作?