我有两个端点数组,如下所示:
t1 = np.array([0,13,22,...,99994])
t2 = np.array([4,14,25,...,99998])
Run Code Online (Sandbox Code Playgroud)
我正在寻找最有效的方法来生成如下所示的输出:
np.array([0,1,2,3,4,13,14,22,23,24,25,...,99994,99995,99996,99997,99998])
Run Code Online (Sandbox Code Playgroud)
一种方法是这样的:
np.array([i for a, b in zip(t1, t2) for i in range(a, b + 1)])
Run Code Online (Sandbox Code Playgroud)
这个解决方案很慢,我确信它仍然可以通过完全用 Numpy 中的一些函数完全替换 zip 和列表理解组合来大大改进,只是我不知道如何。你们能告诉我最有效的方法吗?
提前谢谢你们
生成这两个数组的代码:
import numpy as np
m =10000
Z = np.arange(0,10*m,10)
t1 = np.random.randint(5, size =m ) + Z
t2 =np.random.randint(5,size = m) + 5 + Z
Run Code Online (Sandbox Code Playgroud) 我有两个数据框;第一个(df1)是:
df1 = pd.DataFrame({'col1': [0,1], 'col2': [0,1]})
df1 = df1.rename(index = {k:v for k,v in zip([0,1],['zero','one'])})
print(df1)
col1 col2
zero 0 0
one 1 1
Run Code Online (Sandbox Code Playgroud)
第二个(df2)是:
df2 = pd.DataFrame({k:v for k,v in zip(['col'+str(i) for i in range(3,10)],
[[2,3]]*7)
})
print(df2)
col3 col4 col5 col6 col7 col8 col9
0 2 2 2 2 2 2 2
1 3 3 3 3 3 3 3
Run Code Online (Sandbox Code Playgroud)
最终产品(df3)应该看起来完全像:
col1 col2 col3 col4 col5 col6 col7 col8 col9
zero 0 0 2 2 2 2 …Run Code Online (Sandbox Code Playgroud) 代码在这里:
import numba as nb
import numpy as np
@nb.njit
def func(size):
ary = np.array([np.arange(size),np.arange(size)+1,np.arange(size)-1]).T
X = np.array([ary[1:,0] - ary[:-1,2],
ary[1:,1] - ary[:-1,2],
ary[1:,0] - ary[1:,1]
])
return X
Z = func(10**9)
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,它给了我一条错误消息,我真的不明白这里发生了什么。njit 修饰的函数不支持在函数内部创建新数组吗?错误消息如下:
TypingError: Invalid use of Function(<built-in function array>) with argument(s) of type(s): (list(array(int64, 1d, C)))
* parameterized
In definition 0:
TypingError: array(int64, 1d, C) not allowed in a homogeneous sequence
raised from C:\Users\User\Anaconda3\lib\site-packages\numba\typing\npydecl.py:459
In definition 1:
TypingError: array(int64, 1d, C) not allowed in a homogeneous sequence
raised …Run Code Online (Sandbox Code Playgroud) 这是我的小示例数据框:
import pandas as pd
import numpy as np
size = 10000
arr1 = np.tile([1/5000,1/12000,1/7000], (size,1))
df = pd.DataFrame(arr1, columns = ['col1','col2','col3'])
df[['col1','col2','col3']] = df[['col1', 'col2', 'col3']].astype(str)
Run Code Online (Sandbox Code Playgroud)
我想用大熊猫字符串的方法来转换'col1', ' col2' and 'col3'到10十进制的地方串(这样'0.0002' becomes '0.0002000000','8.333333333333333e-05' becomes '0.0000833333'和'0.00014285714285714287' becomes '0.0001428571')什么是最Python的方式来实现这一目标?
编辑1:
再添加一列以更好地代表我的小问题
EDIT2:我想提一下,我知道df.apply()并且df.applymap()确实存在,他们可以完成工作,但考虑到性能,我正在寻找一种矢量化方式来实现这一目标。因此我更喜欢熊猫字符串方法。当然,如果没有这样的字符串方法可以达到我的目标,那么我很乐意接受最高答案。
因此,我为多处理内容创建了一个列表(特别是它multiprocessing.Pool().starmap()),并希望减少其内存大小。名单如下:
import sys
import numpy as np
from itertools import product
lst1 = np.arange(1000)
lst3 = np.arange(0.05, 4, 0.05)
lst1_1 = list(product(enumerate(lst3),
(item for item in product(lst1, lst1) if item[0] < item[1])
))
Run Code Online (Sandbox Code Playgroud)
其内存大小计算sys.getsizeof(lst1_1)为317840928
看到lst1is的类型int32,我认为将 lstint16的 dtype更改为可以减少的内存大小lst1,因此, ls1_1由于int16占用了一半的内存作为int32数据,因此我做了以下操作:
lst2 = np.arange(1000, dtype = np.int16)
lst2_1 = list(product(enumerate(lst3),
(item for item in product(lst2, lst2) if item[0] < item[1])
))
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,lst2_1计算出的内存大小sys.getsizeof(lst2_1) …
因此,我正在测试同一功能的两个版本的速度;一种是将numpy数组的视图反转两次,另一种则没有。代码如下:
import numpy as np
from numba import njit
@njit
def min_getter(arr):
if len(arr) > 1:
result = np.empty(len(arr), dtype = arr.dtype)
local_min = arr[0]
result[0] = local_min
for i in range(1,len(arr)):
if arr[i] < local_min:
local_min = arr[i]
result[i] = local_min
return result
else:
return arr
@njit
def min_getter_rev1(arr1):
if len(arr1) > 1:
arr = arr1[::-1][::-1]
result = np.empty(len(arr), dtype = arr.dtype)
local_min = arr[0]
result[0] = local_min
for i in range(1,len(arr)):
if arr[i] < local_min:
local_min = arr[i] …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用numba(目前我正在使用numba 0.45.1)来加速代码,但遇到了布尔索引的问题。代码如下:
from numba import njit
import numpy as np
n_max = 1000
n_arr = np.hstack((np.arange(1,3),
np.arange(3,n_max, 3)
))
@njit
def func(arr):
idx = np.arange(arr[-1]).reshape((-1,1)) < arr -2
result = np.zeros(idx.shape)
result[idx] = 10.1
return result
new_arr = func(n_arr)
Run Code Online (Sandbox Code Playgroud)
一旦我运行代码,我就会收到以下消息
TypingError: Invalid use of Function(<built-in function setitem>) with argument(s) of type(s): (array(float64, 2d, C), array(bool, 2d, C), float64)
* parameterized
In definition 0:
All templates rejected with literals.
In definition 1:
All templates rejected without literals. …Run Code Online (Sandbox Code Playgroud) TL;DR:我的问题是如何改进我的功能以超越熊猫自己的最大移动功能?
背景资料:
所以我正在处理很多移动平均线、移动最大值和移动最小值等,到目前为止我发现的唯一像特征一样的移动窗口是在pandas.rolling 方法中。问题是:我拥有的数据是 numpy 数组,我想要的最终结果也必须在 numpy 数组中;就像我想简单地将它转换为熊猫系列并返回到 numpy 数组来完成这样的工作:
result2_max = pd.Series(data_array).rolling(window).max().to_numpy()
Run Code Online (Sandbox Code Playgroud)
,这太非pythonic了,因为转换数据类型似乎没有必要,而且可能有一些方法可以纯粹在numpy实现中做完全相同的事情。
然而,尽管它看起来不像 Python,但它比我在网上提出或看到的任何方法都要快。我将在下面给出一些小基准:
import numpy as np
import pandas as pd
def numpy_rolling_max(data, window):
data = data[::-1]
data_strides = data.strides[0]
movin_window = np.lib.stride_tricks.as_strided(data,
shape=(data.shape[0] - window +1, window),
strides = (data_strides ,data_strides)
)[::-1]
max_window =np.amax(movin_window, axis = 1)#this line seems to be the bottleneck
nan_array = np.full(window - 1, np.nan)
return np.hstack((nan_array, max_window))
def pandas_rolling_max(data, window):
return pd.Series(data).rolling(window).max().to_numpy()
length = 120000
window = 190
data …Run Code Online (Sandbox Code Playgroud) 请原谅我提出这样一个愚蠢的问题,但我在网上找不到任何答案。
Numpy的dtype文档仅显示每种浮点类型的X位指数和Y位尾数,但我无法将X位指数和Y位尾数转换为小数点之前/之后的多少位数。有没有简单的公式/表格可以查询?
先感谢您
我对 Numpy 还很陌生,并且正在搞乱 Numpy 的dtypes,发现特定于字符串的 dtype(又名“U”)比对象类型占用更多的内存空间。说明这一事实的代码如下:
size= 100000
half_size = size//2
ind1 = np.arange(half_size)*2+1
ind2 = np.arange(half_size)*2
X = np.empty(size, dtype = 'object')
X[ind1] = 'smile'
X[ind2] = 'smile2'
W = np.empty(size, dtype = 'U6')
W[ind1] = 'smile'
W[ind2] = 'smile2'
print(X.nbytes)
print(W.nbytes)
Run Code Online (Sandbox Code Playgroud)
结果如下:
800000
2400000
Run Code Online (Sandbox Code Playgroud)
我的问题如下:
1)为什么会发生这种情况?为什么 dtype = 'U6' 占用的内存是 dtype = object 的 3 倍
2)有没有办法创建一个比 dtype = object 占用更少内存空间的字符串numpy数组?
先感谢您
编辑:我想解释一下,我的帖子不是另一篇帖子的重复,因为我的帖子是关于内存使用情况的,而另一篇文章没有提及有关 dtype = 'U' 与 dtype = 'object 的内存使用情况'
编辑2:虽然我已经从另一篇文章中学到了一些新东西,但不幸的是另一篇文章没有回答我的问题,因为我的文章是关于内存使用的,而另一篇文章没有提到有关 …
我对 python 中的 numba 包很陌生。我不确定我是否正确使用了 numba.jit,但代码运行速度太慢,每行循环 23.7 秒: Z1 = mmd(X,Y,20) 优化代码的正确方法是什么?我需要你们的帮助。谢谢你。
这是我的代码:
import pandas as pd
import numba as nb
import numpy as np
@nb.jit
def mmd(array1, array2, n):
n1 = array1.shape[0]
MMD = np.empty(n1, dtype = 'float64')
for i in range(n-1,n1):
MMD[i] = np.average(abs(array1[i+1-n:i+1] - array2[i]))
return MMD
X = np.array([i**2 for i in range(1000000)])
Y = np.array([i for i in range(1000000)])
Z1 = mmd(X,Y,20)
Run Code Online (Sandbox Code Playgroud)
编辑:进一步简化代码
EDIT2:试过@nb.jit(nopython = True),然后有一个错误信息:
KeyError: "<class 'numba.targets.cpu.CPUTargetOptions'> does not support option: 'nonpython'"
Run Code Online (Sandbox Code Playgroud)
也试过: …