沿轴连接字符串

时间:2018-10-06 10:09:58

标签: python numpy

假设我有一个字符串的numpy数组,像这样:

import numpy as np
print('numpy version:', np.__version__)

a = np.arange(25).reshape(5, 5)
stra = a.astype(np.dtype(str))

print(stra)

输出:

numpy version: 1.15.2
[['0' '1' '2' '3' '4']
 ['5' '6' '7' '8' '9']
 ['10' '11' '12' '13' '14']
 ['15' '16' '17' '18' '19']
 ['20' '21' '22' '23' '24']]

我想沿着给定的轴工作,选择一些元素,然后连接这些字符串。首先,我尝试了这个:

print(np.apply_along_axis('|'.join, 1, stra.take([2, 3], 1)))

但是结果较长的字符串会被截断以匹配最短的字符串:

['2|3' '7|8' '12|' '17|' '22|']

我当然可以编写自己的循环来获得所需的输出,但是当单线纸几乎可以工作时,这样做并不令人满意。

def join_along_axis(array, indices, axis):        
    if array.ndim == 1:
        return np.array('|'.join(array.take(indices)))

    joined = []        
    # Move axis of interest to end and flatten others to make the loop easy.
    work_arr = np.rollaxis(array, axis, -1)
    shape = work_arr.shape
    new_shape = (np.product(work_arr.shape[:-1]), work_arr.shape[-1])
    work_arr = work_arr.reshape(new_shape)

    for arr in work_arr:
        joined.append('|'.join(arr.take(indices)))

    return np.array(joined).reshape(shape[:-1])

print(join_along_axis(stra, [2, 3], 1))

输出:

['2|3' '7|8' '12|13' '17|18' '22|23']

是否有比我的join_along_axis函数更精巧的方法?

为清楚起见进行更新:我需要使它具有足够的通用性,以处理具有任意数量维数并沿任意选定轴的数组。

2 个答案:

答案 0 :(得分:1)

我首先尝试使用apply_along_axis按照自己的方式进行操作,但是我发现它可能会比较棘手,apparently NP对于处理字符串的定义不是很好。

那么列表理解呢?

a =a = np.arange(25).reshape(5, 5)
stra = a.astype(np.dtype(str))
only23 = zip(stra[:,2],stra[:,3])
only23

输出:

  

[(''2','3'),('7','8'),('12','13'),('17','18'),('22',' 23')]

现在让我们进行理解:

[x[0] +'|'+x[1] for x in only23]

输出:

  

['2 | 3','7 | 8','12 | 13','17 | 18','22 | 23']

您实际上可以将它变成单线,我只是认为它不那么可读

答案 1 :(得分:0)

在@theshopen链接的GitHub对话中,似乎我可以使用lambda来指定所需的字符串大小。如此有效:

lens = np.vectorize(len)
indices = [2, 3]
axis = 1

new_len = lens(stra.take(indices, axis)).sum(1).max() + len(indices) - 1
new_type = '{}{}'.format(stra.dtype.char, new_len)

print(np.apply_along_axis(
    lambda x: np.array('|'.join(x), new_type),
    axis, stra.take(indices, axis)))