如果这是一个重复的问题,我很抱歉,我查找了这些信息,但仍然无法找到它.
是否可以通过非常有效地使用递减顺序的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毫秒
非常感谢快速和非常好的答案!
我正在努力实现以下等式:
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可以表示为对角线密集而不消耗大量内存,这可能会导致非常有效的性能,但我不知道这是否可行.
我感谢您的帮助!
给定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
我只是在学习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的文档,但在这个问题上找不到任何东西.
提前致谢,
我已经创建了一个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项目,在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) 在使用UnobservedComponents
from 拟合本地级模型之后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) 试图将 csv 文件加载到 bigquery 表中。有些列的类型是 INTEGER,但一些缺失值是 NULL。所以当我使用命令 bq load 加载时,得到以下错误:
无法将“null”解析为字段的 int
所以我想知道处理这个问题的最佳解决方案是什么,必须先重新处理数据才能加载 bq?
我有一个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) 假设我有一个名为“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) python ×7
numpy ×3
performance ×3
scipy ×3
arrays ×1
cython ×1
operations ×1
regex ×1
sql ×1
statsmodels ×1