在列块中展平或分组数组 - NumPy / Python
Flatten or group array in blocks of columns - NumPy / Python
有什么简单的方法可以压扁
import numpy
np.arange(12).reshape(3,4)
Out[]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
进入
array([ 0, 1, 4, 5, 8, 9, 2, 3, 6, 7, 10, 11])
您似乎希望考虑特定数量的列来形成块,然后获取每个块中的元素,然后移动到下一个块中。因此,考虑到这一点,这是一种方法 -
In [148]: a
Out[148]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [149]: ncols = 2 # no. of cols to be considered for each block
In [150]: a.reshape(a.shape[0],-1,ncols).swapaxes(0,1).ravel()
Out[150]: array([ 0, 1, 4, 5, 8, 9, 2, 3, 6, 7, 10, 11])
中详细讨论了背后的动机。
此外,要保持二维格式 -
In [27]: a.reshape(a.shape[0],-1,ncols).swapaxes(0,1).reshape(-1,ncols)
Out[27]:
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[ 2, 3],
[ 6, 7],
[10, 11]])
并以 直观的 3D 数组格式 -
In [28]: a.reshape(a.shape[0],-1,ncols).swapaxes(0,1)
Out[28]:
array([[[ 0, 1],
[ 4, 5],
[ 8, 9]],
[[ 2, 3],
[ 6, 7],
[10, 11]]])
您可以使用列表理解将数组分割成块,然后使用 numpy.ndarray.flatten
方法将块展平成一维数组(这仅在 a.shape[1]
可被块大小 n
):
import numpy as np
a = np.arange(12).reshape(3, 4)
n = 2
res = np.array([a[:, i : i + n] for i in range(0, a.shape[1], n)]).flatten()
print(res)
输出:
[ 0 1 4 5 8 9 2 3 6 7 10 11 ]
另一种方式:
first_list = [entry[0:2] for entry in a]
second_list = [entry[2:4] for entry in a]
flat_list = [item for sublist in first_list for item in sublist] + [item for sublist in second_list for item in sublist]
flat_list # [0, 1, 4, 5, 8, 9, 2, 3, 6, 7, 10, 11]
为此,我将简单地切片并 concatenate
:
n = a.shape[1]//2
np.concatenate([a[:,:n], a[:,n:]]).ravel()
# array([ 0, 1, 4, 5, 8, 9, 2, 3, 6, 7, 10, 11])
如果您愿意,我有一个不涉及 numpy 的解决方案,它会处理您将获得的每种数组,
[[12312],[],[[]]]
[[[2]], [4, [5, 6, [6], 6, 6, 6], 7]]
[-1, [1, [-2], 1], -1]
etc
第一个选项(不适用于 strings)
def flat_list(array):
return list(flatten(array))
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
第二个选项:
def flatten(nested): #in case you got strings and you want to avoide an infinite recursion
try:
# Don't iterate over string-like objects:
try: nested + ''
except TypeError: pass
else: raise TypeError
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
您在这里使用了 numpy。它有一种方法可以完全按照您的意愿行事。
import numpy as np
arr = np.arange(12).reshape(3,4)
flat = arr.flatten()
另一种方法:
a = []
[a.extend(x) for x in arr]
有什么简单的方法可以压扁
import numpy
np.arange(12).reshape(3,4)
Out[]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
进入
array([ 0, 1, 4, 5, 8, 9, 2, 3, 6, 7, 10, 11])
您似乎希望考虑特定数量的列来形成块,然后获取每个块中的元素,然后移动到下一个块中。因此,考虑到这一点,这是一种方法 -
In [148]: a
Out[148]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [149]: ncols = 2 # no. of cols to be considered for each block
In [150]: a.reshape(a.shape[0],-1,ncols).swapaxes(0,1).ravel()
Out[150]: array([ 0, 1, 4, 5, 8, 9, 2, 3, 6, 7, 10, 11])
此外,要保持二维格式 -
In [27]: a.reshape(a.shape[0],-1,ncols).swapaxes(0,1).reshape(-1,ncols)
Out[27]:
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[ 2, 3],
[ 6, 7],
[10, 11]])
并以 直观的 3D 数组格式 -
In [28]: a.reshape(a.shape[0],-1,ncols).swapaxes(0,1)
Out[28]:
array([[[ 0, 1],
[ 4, 5],
[ 8, 9]],
[[ 2, 3],
[ 6, 7],
[10, 11]]])
您可以使用列表理解将数组分割成块,然后使用 numpy.ndarray.flatten
方法将块展平成一维数组(这仅在 a.shape[1]
可被块大小 n
):
import numpy as np
a = np.arange(12).reshape(3, 4)
n = 2
res = np.array([a[:, i : i + n] for i in range(0, a.shape[1], n)]).flatten()
print(res)
输出:
[ 0 1 4 5 8 9 2 3 6 7 10 11 ]
另一种方式:
first_list = [entry[0:2] for entry in a]
second_list = [entry[2:4] for entry in a]
flat_list = [item for sublist in first_list for item in sublist] + [item for sublist in second_list for item in sublist]
flat_list # [0, 1, 4, 5, 8, 9, 2, 3, 6, 7, 10, 11]
为此,我将简单地切片并 concatenate
:
n = a.shape[1]//2
np.concatenate([a[:,:n], a[:,n:]]).ravel()
# array([ 0, 1, 4, 5, 8, 9, 2, 3, 6, 7, 10, 11])
如果您愿意,我有一个不涉及 numpy 的解决方案,它会处理您将获得的每种数组,
[[12312],[],[[]]]
[[[2]], [4, [5, 6, [6], 6, 6, 6], 7]]
[-1, [1, [-2], 1], -1]
etc
第一个选项(不适用于 strings)
def flat_list(array):
return list(flatten(array))
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
第二个选项:
def flatten(nested): #in case you got strings and you want to avoide an infinite recursion
try:
# Don't iterate over string-like objects:
try: nested + ''
except TypeError: pass
else: raise TypeError
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
您在这里使用了 numpy。它有一种方法可以完全按照您的意愿行事。
import numpy as np
arr = np.arange(12).reshape(3,4)
flat = arr.flatten()
另一种方法:
a = []
[a.extend(x) for x in arr]