标签: vectorization

从 R 中矩阵的每一行中选择一个元素

问题与此处相同,但在 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)))这个作品。但我仍然想知道是否有更矢量化的方式,没有列表。

r vectorization

1
推荐指数
1
解决办法
1550
查看次数

NumPy:对矩阵的每 n 列求和

我想对矩阵的每 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)

如何矢量化此操作?

python numpy sum matrix vectorization

1
推荐指数
1
解决办法
3434
查看次数

Fortran 中的向量化数组比较

我想使用单行语句在 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)

这可能吗?如果是这样,我该怎么做?

arrays fortran vectorization

1
推荐指数
1
解决办法
1546
查看次数

加速矩阵中每个 x,y 点的角度计算

我有一个 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 上执行。

有没有一种方法可以加快速度,可能是通过使用一些矩阵运算,而不是一次处理一个像素。

python performance numpy vectorization scipy

1
推荐指数
1
解决办法
398
查看次数

sum 使用索引列表对 numpy 矩阵的行进行分组

使用索引列表和应用函数切片 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)

python numpy vectorization

1
推荐指数
1
解决办法
171
查看次数

Python Pandas——映射两个数据框中的值

我有两个数据框df1df2.

我试图找出执行的映射,对于在每一行的最好方式df1,我想搜索匹配(idtime_by_hour)中df2,然后填入相应的值df2df1

下面是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)

python mapping merge vectorization pandas

1
推荐指数
1
解决办法
6788
查看次数

如何使用 case_when 而不是 if_else [我的代码中有错误?]

我试图意识到为什么我不能使用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)

r vectorization case-when dplyr tidyverse

1
推荐指数
1
解决办法
2128
查看次数

在numpy 2D数组上-如何在N行变化时将每行的最后N个数组元素设置为零

说,我有一个由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)

我想在很大的数组上执行此操作。有什么方法可以向量化此操作,没有循环,也没有辅助数组吗?

python numpy vectorization

1
推荐指数
1
解决办法
70
查看次数

矢量化是硬件/框架特定的功能还是良好的编码习惯?

我正在尝试围绕矢量化(用于数值计算)进行思考,但我遇到了看似矛盾的解释:

  • 我的理解是,它是一个内置于低级库的功能,它利用给定处理器的并行处理能力同时对多个数据点执行操作。

  • 但是一些教程似乎将其描述为一种编码实践,可以将其合并到他们的代码中以提高效率。如果它也是您正在使用的框架中拥有或没有的功能,那么它是如何编码实践的。

对我的困境更具体的解释:

  • 假设我有一个循环来计算 Python 中数字列表的运算。为了对它进行矢量化,我只需导入 Numpy,然后使用数组函数一步完成计算,而不必编写耗时的循环。Numpy 使用的低级 C 例程将代表我完成所有繁重的工作。

据我所知,了解 Numpy 以及如何导入和使用它并不是一种编码实践。这只是工具和框架的良好知识,仅此而已。

那么为什么人们一直将矢量化称为优秀编码人员在其代码中利用的编码实践呢?

python parallel-processing performance numpy vectorization

1
推荐指数
1
解决办法
87
查看次数

如何在位于向量数组中的向量之间向量化 np.dot?

变量:

x 和 y 是形状为 (N, 2) 的 N 个二维向量数组。

题:

有没有办法在两个数组中对应于相同位置的向量之间执行点积,而无需像列表理解那样显式地编写元素:[np.dot(x[i], y[i]) for i in range(N)]

通常,在 numpy 的其他函数中,我使用该选项axis = 1来实现这一点,但我发现 np.dot 中不存在它。有没有办法设法矢量化这个操作?

python numpy vectorization numpy-ndarray

1
推荐指数
1
解决办法
45
查看次数