You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何numpy数组呈现无形状?OCR转换场景下的技术疑问

问题:numpy.asarray转换OCR结果后形状为()的原因

常规numpy数组的形状表现

常规情况下,numpy数组的形状由其维度决定,比如二维数组的形状会直接体现行列数:

import numpy as np

arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(arr.shape)

输出:

(2, 4)

OCR转换后的异常情况

使用pytesseract进行OCR识别后,用numpy.asarray()转换结果时,出现了形状为()的情况:

import numpy
import pytesseract
import logging

# Windows路径无需额外转义
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract'

logging.basicConfig(level=logging.WARNING)
logging.getLogger('pytesseract').setLevel(logging.DEBUG)

image = r'C:\ocr\target\31832_226140__0001-00002b.jpg'
target = numpy.asarray(pytesseract.image_to_string(image, config='--dpi 96 --psm 6 -c preserve_interword_spaces=1 -c tessedit_char_whitelist="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,- \'" '))
print("target type is:", type(target))
print("target array shape is:", target.shape)

输出:

DEBUG:pytesseract:['C:\\Program Files\\Tesseract-OCR\\tesseract', 'C:\\ocr\\target\\31832_226140__0001-00002b.jpg', 'C:\\Users\\david\\AppData\\Local\\Temp\\tess_p68ogbz9', '--dpi', '96', '--psm', '6', '-c', 'preserve_interword_spaces=1', '-c', "tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,- '", 'txt']
target type is: <class 'numpy.ndarray'>
target array shape is: ()

执行print(target)得到的OCR文本示例:

196 ANGUS, Lynne Manon ........................128 Wellington Rd, Wemuomata Recepnonst
        197 ANGUS, Mane Joan .........00... ......129 Wellington Road, Weinumomata, Married
       198 ANGUS, Manon Jean .........................173 Wellington Road, Weinuiomata,Texi Driver
        199 ANGUS. Noel Fulton ........................127 Weinuomats Road, Weinuomate, Carpenter
   

原因解析

  1. 输入类型决定数组维度:pytesseract.image_to_string()返回的是单个字符串对象,不是列表、元组这类序列结构。
  2. 0维数组的产生:当numpy.asarray()接收单个非序列对象时,会将其包装成0维数组(标量数组),这类数组没有维度,因此形状为()。
  3. 预期形状的误区:你预期的(1, N)或类似形状,需要数组包含序列类型的输入(比如把字符串放进列表),numpy不会自动将单个字符串拆分为字符数组,也不会默认把单个字符串包装成一维数组。

解决方法(可选)

如果要得到一维数组的形状,可以:

  • 将OCR结果放入列表后再转换:
    ocr_text = pytesseract.image_to_string(image, config=...)
    target = numpy.asarray([ocr_text])
    # 此时形状为(1,)
    
  • 若想将字符串拆分为字符数组:
    ocr_text = pytesseract.image_to_string(image, config=...)
    target = numpy.array(list(ocr_text))
    # 此时形状为(字符数,)
    

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:35:33