Python 我有一个长度不等的列表数组,计算每个列表长度的最快方法是什么

Python 我有一个长度不等的列表数组,计算每个列表长度的最快方法是什么,python,pandas,numpy,Python,Pandas,Numpy,考虑数组a a = np.array([ [list(range(np.random.randint(4, 10))) for _ in range(10)], [list(range(np.random.randint(4, 10))) for _ in range(10)] ]).T print(a) [[[0, 1, 2, 3, 4, 5, 6] [0, 1, 2, 3, 4, 5]] [[0, 1, 2, 3, 4, 5, 6, 7] [0,

考虑数组
a

a = np.array([
        [list(range(np.random.randint(4, 10))) for _ in range(10)],
        [list(range(np.random.randint(4, 10))) for _ in range(10)]
    ]).T

print(a)

[[[0, 1, 2, 3, 4, 5, 6] [0, 1, 2, 3, 4, 5]]
 [[0, 1, 2, 3, 4, 5, 6, 7] [0, 1, 2, 3, 4, 5, 6]]
 [[0, 1, 2, 3, 4, 5, 6, 7, 8] [0, 1, 2, 3, 4, 5, 6, 7, 8]]
 [[0, 1, 2, 3, 4, 5, 6, 7, 8] [0, 1, 2, 3, 4]]
 [[0, 1, 2, 3, 4, 5] [0, 1, 2, 3, 4, 5, 6, 7]]
 [[0, 1, 2, 3, 4, 5] [0, 1, 2, 3, 4, 5, 6]]
 [[0, 1, 2, 3, 4] [0, 1, 2, 3, 4]]
 [[0, 1, 2, 3, 4, 5, 6, 7, 8] [0, 1, 2, 3, 4, 5, 6, 7, 8]]
 [[0, 1, 2, 3, 4, 5, 6, 7, 8] [0, 1, 2, 3, 4, 5]]
 [[0, 1, 2, 3, 4, 5, 6, 7] [0, 1, 2, 3, 4, 5, 6]

我希望输出像这样

[[7 6]
 [8 7]
 [9 9]
 [9 5]
 [6 8]
 [6 7]
 [5 5]
 [9 9]
 [9 6]
 [8 7]]

为了使其效率最高,我建议使用发电机:

mygen = (map(len, row) for row in a)

这样你就不需要一次计算所有的东西。你只在需要的时候才做。但是我没有任何CPU基准来备份它。

为了使它最有效,我建议使用生成器:

mygen = (map(len, row) for row in a)
这样你就不需要一次计算所有的东西。你只在需要的时候才做。但是我没有任何CPU基准来备份它。

方法1
pandas

def pir1(a):
    return pd.Series(a.ravel()).str.len().values.reshape(a.shape)
方法2
itertools
map
len

def pir2(a):
    return np.array(
        [i for i in map(len, itertools.chain.from_iterable(a))]).reshape(a.shape)
方法3
@马辛


小型阵列

n, m = 10, 2
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 1000, 20
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 10000, 200
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)


大型阵列

n, m = 10, 2
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 1000, 20
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 10000, 200
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)


非常大的阵列

n, m = 10, 2
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 1000, 20
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 10000, 200
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
方法1
pandas

def pir1(a):
    return pd.Series(a.ravel()).str.len().values.reshape(a.shape)
方法2
itertools
map
len

def pir2(a):
    return np.array(
        [i for i in map(len, itertools.chain.from_iterable(a))]).reshape(a.shape)
方法3
@马辛


小型阵列

n, m = 10, 2
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 1000, 20
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 10000, 200
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)


大型阵列

n, m = 10, 2
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 1000, 20
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 10000, 200
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)


非常大的阵列

n, m = 10, 2
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 1000, 20
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)
n, m = 10000, 200
a = np.array(
    [[list(range(np.random.randint(1, 21))) for _ in range(m)] for _ in range(n)]
)

map
len
我想起来了你是说最快的CPU效率,或者最快的执行速度(最少的行数)?CPU效率,坚持numpy,熊猫,标准库…@piRSquared然后可能将其作为生成器,将是最有效的:
mygen=(map(len,row)用于a行)
,但是没有任何基准来支持它。@Marcin这是一个很好的答案。我已经想出了一个更快的方法,我会张贴。但我宁愿选择一个不是我的答案。你能把它贴出来吗?
map
len
请记住你的意思是最快的CPU效率,或者最快的执行速度(最少的行数)?CPU效率,坚持numpy,熊猫,标准库…@piRSquared然后可能把它作为一个生成器,将是最有效的:
mygen=(map(len,row)对于a中的行)
,但是没有任何基准来支持它。@Marcin这是一个很好的答案。我已经想出了一个更快的方法,我会张贴。但我宁愿选择一个不是我的答案。你能把它贴出来吗?我用了你的建议:
[[I代表我在地图上(len,row)代表a行]
我用了你的建议:
[[I代表我在地图上(len,row)代表a行]