小编Bra*_*mon的帖子

矢量化的2-D移动窗口在numpy包括边缘

我意识到我的问题与numpy中的2D数组上的矢量化移动窗口 非常相似,但那里的答案并不能完全满足我的需求.

是否可以进行包含所谓边缘效应的矢量化2D移动窗口(滚动窗口)?最有效的方法是什么?

也就是说,我想将移动窗口的中心滑过我的网格,这样中心就可以在网格中的每个单元格上移动.沿着网格的边缘移动时,此操作将仅返回与网格重叠的窗口部分.如果窗口完全位于网格内,则返回完整窗口.例如,如果我有网格:

array([[1,2,3,4],
       [2,3,4,5],
       [3,4,5,6],
       [4,5,6,7]])
Run Code Online (Sandbox Code Playgroud)

...并且我想使用3x3以该点为中心的窗口对该网格中的每个点进行采样,该操作应返回一系列数组,或者理想情况下,返回原始数组中的一系列视图,如下所示:

array([[1,2],    array([[1,2,3],    array([[2,3,4],    array([[3,4],
       [2,3]])          [2,3,4]])          [3,4,5]])          [4,5]])

array([[1,2],    array([[1,2,3],    array([[2,3,4],    array([[3,4],
       [2,3],           [2,3,4],           [3,4,5],           [4,5],
       [3,4]])          [3,4,5]])          [4,5,6]])          [5,6]])

array([[2,3],    array([[2,3,4],    array([[3,4,5],    array([[4,5],
       [3,4],           [3,4,5],           [4,5,6],           [5,6],
       [4,5]])          [4,5,6]])          [5,6,7]])          [6,7]])

array([[3,4],    array([[3,4,5],    array([[4,5,6],    array([[5,6],
       [4,5]])          [4,5,6]])          [5,6,7]])          [6,7]])
Run Code Online (Sandbox Code Playgroud)

因为我需要多次执行此操作,速度很重要,理想的解决方案是矢量化操作.

python numpy numba

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

我什么时候应该使用熊猫的 Categorical dtype?

我的问题涉及优化熊猫系列的内存使用。文档说明

a 的内存使用量与Categorical类别数加上数据长度成正比。相比之下,objectdtype 是数据长度的常数倍。

我的理解是,pandasCategorical数据实际上是到表示类别的唯一(向下转换)整数映射,其中整数本身占用(大概)比构成objectdtype的字符串少的字节。

我的问题:有没有规则的拇指使用时pd.Categorical保存记忆了object?前面提到的比例有多直接,它不也取决于系列中每个元素(字符串)的长度吗?

在下面的测试中,pd.Categorical似乎遥遥领先。

import string

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

np.random.seed(444)
%matplotlib inline

def mem_usage(obj, index=False, total=True, deep=True):
    """Memory usage of pandas Series or DataFrame."""
    # Ported from https://www.dataquest.io/blog/pandas-big-data/
    usg = obj.memory_usage(index=index, deep=deep)
    if isinstance(obj, pd.DataFrame) and total:
        usg = usg.sum()
    # Bytes to megabytes …
Run Code Online (Sandbox Code Playgroud)

python memory pandas categorical-data

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

大熊猫里的`re.sub()`

说我有:

s = 'white male, 2 white females'
Run Code Online (Sandbox Code Playgroud)

并希望"扩展"到:

'white male, white female, white female'
Run Code Online (Sandbox Code Playgroud)

更完整的案例清单将是:

  • '两个西班牙裔男性,两个西班牙裔女性'
    • - >'西班牙裔男性,西班牙裔男性,西班牙裔女性,西班牙裔女性'
  • '2个黑人男性,白人男性'
    • - >'黑男,黑男,白男'

好像我很接近:

import re

# Do I need boundaries here?
mult = re.compile('two|2 (?P<race>[a-z]+) (?P<gender>(?:fe)?male)s')

# This works:
s = 'white male, 2 white females'
mult.sub(r'\g<race> \g<gender>, \g<race> \g<gender>', s)
# 'white male, white female, white female'

# This fails:
s = 'two hispanic males, 2 hispanic females'
mult.sub(r'\g<race> \g<gender>, \g<race> \g<gender>', s)
# ' ,  , hispanic males, …
Run Code Online (Sandbox Code Playgroud)

python regex pandas

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

在GridSearchCV中明确指定测试/训练集

cv对sklearn的参数有疑问GridSearchCV

我正在处理具有时间成分的数据,因此我认为在KFold交叉验证中进行随机混洗似乎并不明智。

取而代之的是,我想在中明确指定训练,验证和测试数据的临界值GridSearchCV。我可以这样做吗?

为了更好地阐明问题,以下是我手动解决的方法。

import numpy as np
import pandas as pd
from sklearn.linear_model import Ridge
np.random.seed(444)

index = pd.date_range('2014', periods=60, freq='M')
X, y = make_regression(n_samples=60, n_features=3, random_state=444, noise=90.)
X = pd.DataFrame(X, index=index, columns=list('abc'))
y = pd.Series(y, index=index, name='y')

# Train on the first 30 samples, validate on the next 10, test on
#     the final 10.
X_train, X_val, X_test = np.array_split(X, [35, 50])
y_train, y_val, y_test = np.array_split(y, [35, 50])

param_grid = {'alpha': …
Run Code Online (Sandbox Code Playgroud)

python scikit-learn grid-search

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

获取原始定义的函数模块

给定一个类或函数,有没有办法找到最初定义它的模块的完整路径?(即使用def xxxclass xxx.)

我知道有sys.modules[func.__module__].但是,如果func是在一个包中导入__init__.py,那么sys.modules只需重定向到那个__init__.py,因为就我的理解而言,该函数已被引入该命名空间.

一个具体的例子:

>>> import numpy as np
>>> import sys

>>> np.broadcast.__module__
'numpy'

>>> sys.modules[np.broadcast.__module__]
<module 'numpy' from '/Users/brad/.../site-packages/numpy/__init__.py'>
Run Code Online (Sandbox Code Playgroud)

显然,broadcast没有定义__init__.py; 它只是带进命名空间中的一个,这些 from module import *语句.

很高兴看到源np.broadcast中的定义位置(无论文件扩展名是什么,不管是.c还是.py).这可能吗?

python python-import

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

与“sys.getsizeof”不一致

为什么长度sys.getsizeof()为 1 的 Pythonstr比长度为 2 的字符串大?(对于长度 > 2,该关系似乎按预期单调增加。)

例子:

>>> from string import ascii_lowercase
>>> import sys

>>> strings = [ascii_lowercase[:i] for i, _ in enumerate(ascii_lowercase, 1)]
>>> strings
['a',
 'ab',
 'abc',
 'abcd',
 'abcde',
 'abcdef',
 'abcdefg',
 # ...

>>> sizes = dict(enumerate(map(sys.getsizeof, strings), 1))
>>> sizes
{1: 58,   # <--- ??
 2: 51,
 3: 52,
 4: 53,
 5: 54,
 6: 55,
 7: 56,
 8: 57,
 9: 58,
 10: 59,
 11: 60,
 12: 61,
 13: 62,
 14: …
Run Code Online (Sandbox Code Playgroud)

python string python-3.x pandas

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

使用魔术命令 %% timeit -n1 -r1 导致 jupyter 不保留局部变量的值

我刚刚注意到一些非常奇怪的事情。当我使用%%timeit -n1 -r1magic命令,在Jupyter lab中测量一段代码的执行时间时,python在执行完该块后,并没有保留局部变量的值!例如,如果我运行包含以下代码的代码块:

for i in range(10):
   for j in range(10):
       d = i - j
Run Code Online (Sandbox Code Playgroud)

然后print(d)在另一个块中运行,jupyter 将显示上次迭代中 d 的值。但是如果我运行这段代码:

%%timeit -n1 -r1
for in in range(10):
   for j in range(10):
       d = i - j
Run Code Online (Sandbox Code Playgroud)

然后运行print(d),juoyter 向我显示了一条错误消息:

NameError: name 'd' is not defined
Run Code Online (Sandbox Code Playgroud)

这种奇怪行为背后的解释是什么?

python-3.x jupyter-notebook jupyter-lab

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

Google Drive API:检查文件夹是否存在

我正在使用 Google Drive API 来尝试回答一个看似简单的问题:驱动器中是否存在某个名称的文件夹?

规格:

  • 驱动 API V3 版本
  • Python客户端: googleapiclient

例子:

鉴于封闭驱动器 ID abcdef,是否存在具有名称June 2019(和 mimeType application/vnd.google-apps.folder)的文件夹?

当前路线:

>>> from googleapiclient.discovery import build
>>> # ... build credentials
>>> driveservice = build("drive", "v3", credentials=cred).files()
>>> [i for i in driveservice.list().execute()['files'] if 
...  i['name'] == 'June 2019' and i['mimeType'] == 'application/vnd.google-apps.folder']                                                                                                                                                                     
[{'kind': 'drive#file',
  'id': '1P1k5c2...........',
  'name': 'June 2019',
  'mimeType': 'application/vnd.google-apps.folder'}]
Run Code Online (Sandbox Code Playgroud)

所以答案是肯定的,文件夹存在。但是应该有一种更有效的方法来通过.list()传递driveId. 那怎么办呢?我尝试了各种组合,所有这些组合似乎都会引发非 200 响应。

>>> FOLDER_ID = "abcdef........"
>>> driveservice.list(corpora="drive", …
Run Code Online (Sandbox Code Playgroud)

python google-drive-api

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

将 KeycloakOIDCFilter 与 Spark UI 结合使用 - 无法配置

我们正在尝试将KeycloakOIDCFilter其用作 Apache Spark UI 过滤器。然而,我们正在努力配置它KeycloakOIDCFilter本身。

我们在spark-defaults.conf中有:

spark.ui.filters=org.keycloak.adapters.servlet.KeycloakOIDCFilter
Run Code Online (Sandbox Code Playgroud)

该过滤器已成功获取,并且 Spark 主日志显示此过滤器已应用于所有 URL 路由。

我们已经在 Keycloak 管理控制台中生成了一个客户端配置文件,该文件已生成一个keycloak-oidc.json.

但我们如何讲述KeycloakOIDCFilter这些信息呢?

来自 Spark文档

还可以通过设置spark.<class name of filter>.param.<param name>=<value> 以下形式的配置条目在配置中指定过滤器参数:

spark.ui.filters=com.test.filter1
spark.com.test.filter1.param.name1=foo
spark.com.test.filter1.param.name2=bar
Run Code Online (Sandbox Code Playgroud)

在我们的例子中,这似乎是:

spark.org.keycloak.adapters.servlet.KeycloakOIDCFilter.param.<name>=<value>
Run Code Online (Sandbox Code Playgroud)

但是,KeycloakOIDCFilter Java 类只有两个构造函数。一种根本不带任何参数,一种带KeycloakConfigResolver.

Keycloak Java servlet 过滤器适配器文档仅讨论web.xml在配置 Spark 的情况下不适用的内容。

那么我们如何正确配置/指向KeycloakOIDCFilterservlet 过滤器的参数呢?


更新:我们已经确定spark.org.keycloak.adapters.servlet.KeycloakOIDCFilter.param.keycloak.config.file可用于指向配置文件,但Spark 似乎不使用 SessionManager,从而导致可能无法解决的单独错误。

java servlet-filters apache-spark openid-connect keycloak

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

请求/ aiohttp:关闭响应对象

我对需要有点糊涂了.close()两个响应对象requestsaiohttp.(请注意,这是一个单独的实例方法,而不是 - session.close()我在谈论响应对象本身.)

  • 请问Response(requests)或ClientResponse(aiohttp)在任何时候需要显式调用.close()
  • 如果不是,那么将响应本身用作上下文管理器的目的是什么?(async with session.request('GET', 'https://www.pastebin.com')下面.)为什么要定义两个dunder方法,如果它被隐式关闭,如下所示?

一些简单的测试(下面)似乎暗示响应在Session上下文管理器中定义时会自动关闭. (这本身调用self.close()__exit____aexit__但这是会话,而不是Response对象的关闭.)

示例 - requests

>>> import requests
>>> 
>>> with requests.Session() as s:
...     resp = s.request('GET', 'https://www.pastebin.com')
...     resp.raise_for_status()
...     print(resp.raw.closed)  # `raw` is urllib3.response.HTTPResponse object
...     print(resp.raw._pool)
...     print(resp.raw._connection)
...     c = resp.text
... 
True
HTTPSConnectionPool(host='pastebin.com', port=443)
None
>>>
>>> while 1:
...     print(resp.raw.closed) …
Run Code Online (Sandbox Code Playgroud)

python python-requests aiohttp python-3.7

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