小编Wil*_*uks的帖子

有效地查找Python数组/列表中N个最大元素的索引

如果这是一个重复的问题,我很抱歉,我查找了这些信息,但仍然无法找到它.

是否可以通过非常有效地使用递减顺序的N个最大元素的索引来排列numpy数组(或python列表)?

例如,数组:

a = array([4, 1, 0, 8, 5, 2])
Run Code Online (Sandbox Code Playgroud)

降序中最大元素的索引将给出(考虑N = 6,包括所有元素):

8 - > 3

5 - > 4

4 - > 0

2 - > 5

1 - > 1

0 - > 2

result = [3, 4, 0, 5, 1, 2]
Run Code Online (Sandbox Code Playgroud)

我知道如何使用一些有点愚蠢的方法来制作它(比如对数组进行排序并搜索其索引中的每个N个数字),但我想知道是否有任何有效的库,如瓶颈或heapq,或者可能是pythonic方法这非常快.我必须在几个阵列中应用它,每个阵列有300k元素,这就是性能问题的原因.

提前致谢!

UPDATE

我读了答案并决定使用300k的随机整数来计算它们,结果如下:

解决方案1: sorted(range(len(a)), key=lambda i:a[i]) 时间: 230毫秒

解决方案2: heapq.nlargest(len(a), zip(a, itertools.count())) 时间: 396毫秒

解决方案3: heapq.nlargest(len(a), enumerate(a), key=operator.itemgetter(1)) 时间: 864毫秒

解决方案4: def f(a,N): return np.argsort(a)[::-1][:N] (N = len(a)) 时间:104毫秒

非常感谢快速和非常好的答案!

python performance numpy

19
推荐指数
3
解决办法
2万
查看次数

有效地乘以Numpy/Scipy稀疏矩阵和密集矩阵

我正在努力实现以下等式:

X =(Y.T * Y + Y.T * C * Y) ^ -1
Run Code Online (Sandbox Code Playgroud)

Y是(nxf)矩阵,C是(nxn)对角线; n约为300k,f在100到200之间变化.作为优化过程的一部分,这个等式将使用近1亿次,因此必须非常快速地处理.

Y是随机初始化的,C是一个非常稀疏的矩阵,对角线上300k中只有少数数字与0不同.由于Numpy的对角线函数创建了密集矩阵,我创建了C作为稀疏csr矩阵.但是当试图解决方程式的第一部分时:

r = dot(C, Y)
Run Code Online (Sandbox Code Playgroud)

由于内存限制,计算机崩溃.我决定然后尝试将Y转换为csr_matrix并进行相同的操作:

r = dot(C, Ysparse)
Run Code Online (Sandbox Code Playgroud)

这种方法耗时1.38毫秒.但是这个解决方案有点"棘手",因为我使用稀疏矩阵来存储密集的矩阵,我想知道它真的有多高效.

所以我的问题是,是否有一些方法可以将稀疏的C和密集的Y相乘,而不必将Y变为稀疏并提高性能?如果不知何故C可以表示为对角线密集而不消耗大量内存,这可能会导致非常有效的性能,但我不知道这是否可行.

我感谢您的帮助!

python performance numpy scipy sparse-matrix

16
推荐指数
2
解决办法
2万
查看次数

提高Scipy稀疏矩阵乘法性能

给定Scipy CSC稀疏矩阵"sm",其尺寸(170k x 170k)具有4.4亿个非零点,稀疏CSC矢量"v"(170k x 1)具有一些非零点,有什么可以是为提高操作性能而做的:

resul = sm.dot(v)
Run Code Online (Sandbox Code Playgroud)

目前大约需要1秒钟.初始化矩阵作为CSR将时间增加到3秒,因此CSC表现更好.

SM是产品之间相似性的矩阵,V是表示用户购买或点击的产品的向量.所以对于每个用户来说,sm都是一样的.

我使用的是Ubuntu 13.04,Intel i3 @ 3.4GHz,4核心.

研究SO我读了关于Ablas包的内容.我输入了终端:

~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so
Run Code Online (Sandbox Code Playgroud)

结果导致:

    linux-vdso.so.1 =>  (0x00007fff56a88000)
    libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f888137f000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8880fb7000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8880cb1000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f888183c000)
Run Code Online (Sandbox Code Playgroud)

据我所知,这意味着我已经在使用Ablas的高性能套件.我仍然不确定这个软件包是否已经实现了并行计算,但它看起来并没有.

多核处理有助于提升性能吗?如果是这样,是否有任何库可能有助于python?

我也在考虑在Cython中实现这个的想法,但我不知道这是否会带来好的结果.

提前致谢.

python performance scipy sparse-matrix matrix-multiplication

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

BigQuery与Google Analytics报告中的总会话数

我只是在学习BigQuery,所以这可能是一个愚蠢的问题,但我们想在那里得到一些统计数据,其中一个是给定日期内的总会话数.

为此,我在BQ中查询过:

select sum(sessions) as total_sessions from (
  select
    fullvisitorid,
    count(distinct visitid) as sessions,
    from (table_query([40663402], 'timestamp(right(table_id,8)) between timestamp("20150519") and timestamp("20150519")'))
    group each by fullvisitorid
)
Run Code Online (Sandbox Code Playgroud)

(我正在使用,table_query因为稍后我们可能会增加天数)

这导致了1,075,137.

但在我们的Google Analytics报告中,在"受众群体概述"部分中,当天的结果如下:

This report is based on 1,026,641 sessions (100% of sessions).

尽管有一天,但总有大约5%的差异.所以我想知道,即使查询很简单,我们还有什么错误吗?

这种差异预计会发生吗?我阅读了BigQuery的文档,但在这个问题上找不到任何东西.

提前致谢,

google-analytics google-bigquery

9
推荐指数
2
解决办法
6597
查看次数

float64到float32 Cython错误

我已经创建了一个Cython代码来在密集矩阵和稀疏向量之间进行矩阵运算,如下所示(因为我正在学习Cython我不确定这是一个很好的代码,但它是我能想到的最好的代码远):

import numpy as np
cimport numpy as np
ctypedef np.float64_t dtype_t
ctypedef np.int32_t dtypei_t
cimport cython

@cython.boundscheck(False)
@cython.wraparound(False)
@cython.nonecheck(False)
def cdenseXsparse(np.ndarray[dtype_t, ndim = 2] Y,
                  np.ndarray[dtype_t, ndim = 1] V,
                  np.ndarray[dtypei_t, ndim = 1] I,
                  np.ndarray[dtype_t, ndim = 1] A = None):
    """
    Computes A = Y * (V_I)
    """
    if Y is None:
        raise ValueError("Input cannot be Null")
    A = np.zeros(Y.shape[1])
    cdef Py_ssize_t i, indice
    cdef dtype_t s  
    for i in range(A.shape[0]):             
        s = 0
        for indice in …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy cython

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

Python没有找到模块

给定以下python项目,在PyDev中创建:

??? algorithms
?   ??? __init__.py
?   ??? neighborhood
?       ??? __init__.py
?       ??? neighbor
?       ?   ??? connector.py
?       ?   ??? __init__.py
?       ?   ??? manager.py
?       ?   ??? references.py
?       ??? neighborhood.py
?       ??? tests
?       ?   ??? fixtures
?       ?   ?   ??? neighborhood
?       ?   ??? __init__.py
?       ??? web
?           ??? __init__.py
?           ??? service.py
??? configuration
?   ??? Config.py
?   ??? __init__.py
??? __init__.py
??? webtrack
    |- teste.py
    ??? .gitignore
    ??? __init__.py
    ??? manager
        ??? …
Run Code Online (Sandbox Code Playgroud)

python python-import

8
推荐指数
2
解决办法
3万
查看次数

用未观察到的组件模型模拟时间序列

在使用UnobservedComponentsfrom 拟合本地级模型之后statsmodels,我们试图找到用结果模拟新时间序列的方法.就像是:

import numpy as np
import statsmodels as sm
from statsmodels.tsa.statespace.structural import UnobservedComponents

np.random.seed(12345)
ar = np.r_[1, 0.9]
ma = np.array([1])
arma_process = sm.tsa.arima_process.ArmaProcess(ar, ma)

X = 100 + arma_process.generate_sample(nsample=100)
y = 1.2 * x + np.random.normal(size=100)
y[70:] += 10

plt.plot(X, label='X')
plt.plot(y, label='y')
plt.axvline(69, linestyle='--', color='k')
plt.legend();
Run Code Online (Sandbox Code Playgroud)

时间序列的例子

ss = {}
ss["endog"] = y[:70]
ss["level"] = "llevel"
ss["exog"] = X[:70]

model = UnobservedComponents(**ss)
trained_model = model.fit()
Run Code Online (Sandbox Code Playgroud)

trained_model给定外生变量的情况下,是否可以用来模拟新的时间序列X[70:]?正如我们所拥有的那样arma_process.generate_sample(nsample=100),我们想知道我们是否可以做类似的事情:

trained_model.generate_random_series(nsample=100, exog=X[70:]) …
Run Code Online (Sandbox Code Playgroud)

python scipy statsmodels

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

BigQuery 无法将“null”解析为字段的 int

试图将 csv 文件加载到 bigquery 表中。有些列的类型是 INTEGER,但一些缺失值是 NULL。所以当我使用命令 bq load 加载时,得到以下错误:

无法将“null”解析为字段的 int

所以我想知道处理这个问题的最佳解决方案是什么,必须先重新处理数据才能加载 bq?

google-bigquery

6
推荐指数
2
解决办法
7947
查看次数

通过Array中的元素乘以Python Sparse Matrix的行和列

我有一个numpy数组,如:

array = [0.2, 0.3, 0.4]
Run Code Online (Sandbox Code Playgroud)

(这个矢量实际上是300k密度的大小,我只用简单的例子说明)

以及使用Scipy创建的稀疏对称矩阵,如下所示:

M = [[0, 1, 2]  
     [1, 0, 1]  
     [2, 1, 0]]
Run Code Online (Sandbox Code Playgroud)

(表示密集只是为了说明;在我的实际问题中它是一个(300k x 300k)稀疏矩阵)

是否可以将所有行乘以数组中的元素,然后对列进行相同的操作?

这将首先导致:

M = [[0 * 0.2, 1 * 0.2, 2 * 0.2]
     [1 * 0.3, 0 * 0.3, 1 * 0.3]
     [2 * 0.4, 1 * 0.4, 0 * 0.4]]
Run Code Online (Sandbox Code Playgroud)

(行与数组中的元素相乘)

M = [[0, 0.2, 0.4]
     [0.3, 0, 0.3]
     [0.8, 0.4, 0]]
Run Code Online (Sandbox Code Playgroud)

然后列成倍增加:

M = [[0 * 0.2, 0.2 * 0.3, 0.4 * 0.4]
     [0.3 * 0.2, …
Run Code Online (Sandbox Code Playgroud)

python operations sparse-matrix

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

在 BigQuery Standard SQL 中获取最后一个斜杠后的字符串

假设我有一个名为“Youtube”的列,我想在 URL 的最后一个斜杠之后提取字符串。我将如何在 BigQuery 标准 SQL 中执行此操作?

例子:

https://youtube.com/user/HaraldSchmidtShow

https://youtube.com/user/applesofficial

https://youtube.com/user/GrahamColton
Run Code Online (Sandbox Code Playgroud)

基本上,我想要:

HaraldSchmidtShow

applesofficial

GrahamColton
Run Code Online (Sandbox Code Playgroud)

regex sql google-bigquery

5
推荐指数
2
解决办法
4093
查看次数