标签: vectorization

自动矢量化不起作用

我正在尝试将我的代码设置为自动向量化,但它无法正常工作.

int _tmain(int argc, _TCHAR* argv[])
{
    const int N = 4096;
    float x[N];
    float y[N];
    float sum = 0;

    //create random values for x and y 
    for (int i = 0; i < N; i++)
    {
        x[i] = rand() >> 1;
        y[i] = rand() >> 1;
    }

    for (int i = 0; i < N; i++){
        sum += x[i] * y[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

这里没有循环矢量化,但我真的只对第二个循环感兴趣.

我正在使用visual studio express 2013并且正在编译/O2/Qvec-report:2(报告循环是否被矢量化)选项.编译时,我收到以下消息:

--- Analyzing function: main
c:\users\...\documents\visual studio 2013\projects\intrin3\intrin3\intrin3.cpp(28) …
Run Code Online (Sandbox Code Playgroud)

c++ optimization sse simd vectorization

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

在熊猫中设置联盟

我有两列我存储在我的数据帧中.

我想使用快速矢量化操作在两列上执行set union

df['union'] = df.set1 | df.set2
Run Code Online (Sandbox Code Playgroud)

但错误TypeError: unsupported operand type(s) for |: 'set' and 'bool'阻止我这样做,因为我np.nan在两列中都输入了.

有一个很好的解决方案来克服这个问题吗

python numpy vectorization python-3.x pandas

7
推荐指数
2
解决办法
4717
查看次数

在R中使用唯一函数矢量化for循环

player_ids = c(34, 87, 27, 34, 87, 9, 29, 25, 24, 25, 34, 37)
end = length(player_ids)
unique_players_list = list()

for(i in 1:end) {
  unique_players_list[[i]] = unique(player_ids_unlisted[1:i])
}
Run Code Online (Sandbox Code Playgroud)

这是我试图矢量化的for循环(缩短版本).我不知道如何发布代码输出,但是unique_players_list列表应该具有以下输出:

unique_players_list[[1]] == c(34)
unique_players_list[[2]] == c(34)
unique_players_list[[3]] == c(34, 87)
unique_players_list[[4]] == c(34, 87, 27)     
unique_players_list[[5]] == c(34, 87, 27)
Run Code Online (Sandbox Code Playgroud)

"等等.输出不必在列表中,我实际上更喜欢数据帧,但是我需要这个矢量化,因为我当前的for循环需要永远,我需要运行这个代码数万次."

谢谢!

loops r list unique vectorization

7
推荐指数
3
解决办法
589
查看次数

Numpy掩码计算满足条件的元素数量

如何使用Numpy对此for循环进行向量化?

count=0
arr1 = np.random.rand(184,184)
for i in range(arr1.size[0]):
    for j in range(arr1.size[1]):
        if arr1[i,j] > 0.6:
            count += 1
print count
Run Code Online (Sandbox Code Playgroud)

我试过了:

count=0
arr1 = np.random.rand(184,184)
mask = (arr1>0.6)
indices = np.where(mask)
print indices , len(indices) 
Run Code Online (Sandbox Code Playgroud)

我期望len(指数)给予计数,但事实并非如此.请给我任何建议.

python arrays numpy vectorization

7
推荐指数
2
解决办法
6412
查看次数

矢量地找到数据帧行的邻居

我有两个数据框,下面是每个的一个小样本:

df1 <- data.frame(a1= c(3,4), a2 = c(8, 8), a3 = c(4, 18), a4 = c(9,9), a5 = c(17, 30))

df2 <- data.frame(a1 = c(2,2,2,3,3,3,4,4,4), a2 = c(7,7,7,7,7,7,7,7,7), 
                 a3 = c(4,4,4,4,4,4,4,4,4), a4 = c(10,10,10, 10, 10, 10, 10,10,10), 
                 a5 = c(15,16,17, 15, 16, 17, 15, 16, 17))
Run Code Online (Sandbox Code Playgroud)

我想检查,对于每一行df1,它是否有"邻居" df2,其中,邻居我的意思是每列中最多1个(绝对值)不同的观察.因此,例如,第2行df2是第1行的邻居df1.

我目前这样做的方式如下:

sweep(as.matrix(df2), 2, as.matrix(df1[1,]), "-")
Run Code Online (Sandbox Code Playgroud)

对于第1行df1,我必须为df1的每一行重复此操作.请注意,df2和df1的行数不同.

但是,我真正想要的是避免"按行"这样做,因为我的数据框有很多行.有没有办法矢量化?

r vectorization dataframe

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

在 numpy 中矢量化 for 循环以计算管道胶带重叠

我正在使用 python 创建一个应用程序来计算管道胶带重叠(建模分配器将产品应用到旋转鼓上)。

我有一个可以正常工作的程序,但速度真的很慢。我正在寻找一种解决方案来优化for用于填充 numpy 数组的循环。有人可以帮我矢量化下面的代码吗?

import numpy as np
import matplotlib.pyplot as plt

# Some parameters
width = 264
bbddiam = 940
accuracy = 4 #2 points per pixel

drum = np.zeros(accuracy**2 * width * bbddiam).reshape((bbddiam * accuracy , width * accuracy))

# The "slow" function
def line_mask(drum, coef, intercept, upper=True, accuracy=accuracy):
    """Masks a half of the array"""
    to_return = np.zeros(drum.shape)
    for index, v in np.ndenumerate(to_return):
        if upper == True:
            if index[0] * coef + intercept > …
Run Code Online (Sandbox Code Playgroud)

python for-loop numpy vectorization numba

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

确保 Eigen 对某个操作使用 AVX 矢量化

我已经编写了一些函数的矢量化版本,这些函数目前是算法的瓶颈,使用 Eigen 的工具来做到这一点。

我还通过确保EIGEN_VECTORIZE_AVX在包含 Eigen 之后定义了 AVX 来检查是否启用了 AVX 。

但是,Packet8f如果数据大小不是 8 的倍数,我的函数似乎永远不会被(AVX)调用。相反,它被Packet4f(SSE)调用 。

这是一个小副本:https : //gist.github.com/bitonic/e89561cb21837b4dee8b5f49e1303919。在这里,我使用Packet4fand定义了一个操作Packet8f,然后计算每个使用大小为 8 和 9 的数组调用的次数。当数组大小为 8 时,Packet8f版本将按预期调用一次。当它的大小为 9 时,该Packet4f版本会被调用两次,再加上一次对非矢量化版本的调用。我已经在 Eigen 的当前 master 上测试了这段代码1d0c45122a5c4c5c1c4309f904120e551bacad02

我挖了一点,我相信数据包选择发生在这里:https : //gitlab.com/libeigen/eigen/blob/1d0c45122a5c4c5c1c4309f904120e551bacad02/Eigen/src/Core/util/XprHelper.h#L197

如果我理解正确,如果数据的大小不是动态的并且不是 8 的倍数(即 的值unpacket_traits<Packet8f>::size),则将选择半数据包,这与上面的再现显示的内容相匹配。

如果我的理解是正确的,为什么会这样?不应该选择完整的数据包,其余元素使用非矢量化操作吗?

可能是那个条件是错误的,应该是一个 >= 比较,例如类似的东西

template<int Size, typename PacketType,
         bool Stop = Size==Dynamic || Size >= unpacket_traits<PacketType>::size || is_same<PacketType,typename unpacket_traits<PacketType>::half>::value>
struct find_best_packet_helper;
Run Code Online (Sandbox Code Playgroud)

代替 …

c++ simd vectorization avx eigen

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

find_peaks 未识别阵列开头的峰值

我试图找到一种矢量化方法来查找数组中的第一个位置,其中的值不会高于 n 个先前数字的最大值。我想过使用 scipy.signal 的 find_peaks 方法来查找局部最大值。我认为如果你定义距离,假设 10 n 是 10,那么它确实如此。但不幸的是,距离的条件必须在两个方向上都满足 - 以前的和即将到来的数字。有没有其他方法或方法可以找到这样的东西?

例子:

arr1 = np.array([1.        , 0.73381293, 0.75649351, 0.77693474, 0.77884614,
       0.81055903, 0.81402439, 0.78798586, 0.78839588, 0.82967961,
       0.8448    , 0.83276451, 0.82539684, 0.81762916, 0.82722515,
       0.82101804, 0.82871127, 0.82825041, 0.82086957, 0.8347826 ,
       0.82666665, 0.82352942, 0.81270903, 0.81191224, 0.83180428,
       0.84975767, 0.84044236, 0.85057473, 0.8394649 , 0.80000001,
       0.83870965, 0.83962262, 0.85039371, 0.83359748, 0.84019768,
       0.83281732, 0.83660132])

from scipy.signal import find_peaks
peaks, _ = find_peaks(arr1, distance=10)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它会找到位置 10 和 27。但位置 0 也有 10 个不高的后续元素。我怎样才能找到那些?

python numpy vectorization scipy

7
推荐指数
2
解决办法
1318
查看次数

cuda 的向量化,一个以复数作为输入,一个复数作为输出的函数在 numba 中失败

我使用了一个程序来绘制曼德布罗图,并使用 njit 让它在 CPU 线程上运行。现在我想生成一个 32k 的图像,但即使是整个线程也太慢了。所以我试图让代码在 GPU 上运行。这是代码:

from numba import njit, cuda, vectorize
from PIL import Image, ImageDraw


@vectorize(['complex128(complex128)'], target='cuda')
def mandelbrot(c):

    z = 0
    n = 0
    while abs(z) <= 2 and n < 80:
        z = z*z + c
        n += 1
    return n


def vari(WIDTH, HEIGHT, RE_START, RE_END, IM_START, IM_END, draw):

    for x in range(0, WIDTH):

        for y in range(0, HEIGHT):

            print(x)
            # Convert pixel coordinate to complex number
            c = complex(RE_START + (x / …
Run Code Online (Sandbox Code Playgroud)

cuda cpython vectorization numba

7
推荐指数
2
解决办法
654
查看次数

在python中找到给定元素右侧的第一个非零元素的索引

我有一个 2D numpy.ndarray。给定位置列表,我想找到同一行中给定元素右侧的第一个非零元素的位置。是否可以将其矢量化?我有一个巨大的数组,循环花费了太多时间。

例如:

matrix = numpy.array([
    [1, 0, 0, 1, 1], 
    [1, 1, 0, 0, 1], 
    [1, 0, 0, 0, 1], 
    [1, 1, 1, 1, 1], 
    [1, 0, 0, 0, 1]
])
query = numpy.array([[0,2], [2,1], [1,3], [0,1]])
Run Code Online (Sandbox Code Playgroud)

预期结果:

>> [[0,3], [2,4], [1,4], [0,3]]
Run Code Online (Sandbox Code Playgroud)

目前我正在使用 for 循环执行此操作,如下所示

for query_point in query:
    y, x = query_point
    result_point = numpy.min(numpy.argwhere(self.matrix[y, x + 1:] == 1)) + x + 1
    print(f'{y}, {result_point}')
Run Code Online (Sandbox Code Playgroud)

PS:我也想找到左边的第一个非零元素。我想,找到正确点的解决方案可以很容易地找到左点。

python numpy vectorization numpy-ndarray

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